【发布时间】:2014-05-22 07:45:26
【问题描述】:
我有一个小型聊天应用程序,我使用 SQLite 数据库存储所有对话。我注意到该应用程序随机冻结,然后我必须最小化和最大化它以使其再次工作。我认为问题可能是导致 gui 冻结的 SQLite 选择/插入。我决定尝试将所有 SQLite 方法移动到一个单独的线程中。
这样做后,应用程序仍然冻结。
一些可能值得了解的事情:
我在
MainWindow中直接使用QTcpSocket,但在单独的线程中运行QTcpSocket似乎没有用?我已将 SQLite 方法分离到一个新线程中(参见下面的实现)
我使用 3 个
WebViews来显示我的聊天消息,整个应用程序 GUI 都是使用这些WebViews构建的
我下面的代码真的在单独的线程中运行吗? 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);
【问题讨论】:
-
显示调用 dbthread 函数的代码。你也从主线程调用它们吗?你可能误解了
moveToThread的作用。 -
查看我的编辑,我已经发布了我如何从我的主线程调用 db 方法
-
真正的问题是。它还结冰吗?
-
@Alosyius 为新线程命名并调用
qDebug()<<"function <function> called from: "<<QThread::currentThread()->objectName();