gpt4 book ai didi

c++ - 即使我在单独的线程中运行,QT GUI 也会卡住

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:44:25 25 4
gpt4 key购买 nike

我有一个小型聊天应用程序,我在其中使用 SQLite 数据库来存储所有对话。我注意到该应用程序随机卡住,然后我必须将其最小化和最大化以使其再次运行。我认为问题可能是导致 gui 卡住的 SQLite 选择/插入。我决定尝试将所有 SQLite 方法移动到一个单独的线程中。

这样做之后,应用程序仍然卡住。

一些可能值得了解的事情:

  1. 我直接在我的 MainWindow 中使用 QTcpSocket 但似乎在单独的线程中运行 QTcpSocket 没有用?

  2. 我已将 SQLite 方法分离到一个新线程中(参见下面的实现)

  3. 我使用 3 个 WebViews 来显示我的聊天消息,整个应用程序 GUI 都是用这些 WebViews

  4. 构建的

我下面的代码真的在单独的线程中运行吗? GUI 仍然卡住。

我的头文件:

class dbThread : public QObject
{
Q_OBJECT

public:
dbThread(QObject* parent);

public slots:
bool openDB(QString agentID);

signals:
void clearPreviousHistory();

private:
QSqlDatabase db;
QHash<QString, QString> countries;
};

我的cpp文件:

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
QThread* thread = new QThread(this);
dbtrad = new dbThread(this);
dbtrad->moveToThread(thread);

dbtrad->openDB(userID);

connect(dbtrad, SIGNAL(clearPreviousHistory()), this, SLOT(clearHistoryV()));
thread->start();

}



dbThread::dbThread(QObject * parent): QObject(parent) {
}

bool dbThread::openDB(QString agentID) {

qDebug() << "OPEN DB FROM THREAD ";

// Find QSLite driver
db = QSqlDatabase::addDatabase("QSQLITE");

// ......
}

这就是我从 MainWindow 调用 dbThread 方法的方式:

dbtrad->getHistory(channelId);

编辑

新代码:

// Start database thread
QThread* thread = new QThread(this);
dbtrad = new dbThread(this);
dbtrad->moveToThread(thread);

connect(this, SIGNAL(requestOpenDB(QString)), dbtrad, SLOT(openDB(QString)));
thread->start();

emit requestOpenDB(userID);

最佳答案

dbtrad->openDB(userID); 将像任何普通函数一样执行(为什么要这样?),在 GUI 线程中

moveToThread 允许您在单独的线程中执行使用信号调用的槽

如果你想在线程中执行openDB,你可以使用

触发它的执行
 connect (thread, SIGNAL(started()), dbtrad, SLOT(openDBWithUIDAlreadySet()))

 connect (this, SIGNAL(requestOpenDB(int)), dbtrad, SLOT(openDB(int)))

您需要使用现有的或额外的信号。 Qthread::start() 发出信号 started()。你也可以定义

MainWindow{

signals:
void requestOpenDB(int);
void queryHistory(int channelid);
}

并使用手动发出信号

emit requestOpenDB(userID);    //for openDB
emit queryHistory(channelId); // for getHistory

dbThread 对象的响应也需要使用连接到插槽的信号给出。就像一个通知。

关于c++ - 即使我在单独的线程中运行,QT GUI 也会卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23800709/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com