【发布时间】:2015-08-25 07:59:02
【问题描述】:
我正在开发一个应用程序,它进行一些 TCP 通信,使用数据库并有一个 GUI(很常见)。在互联网上尝试使用数据库时,我注意到 GUI 响应缓慢,这促使使用线程来处理后端。我现在正在玩这个,并考虑重新设计一个完整的应用程序来充分解决这个问题。所以我想把 GUI(一个从 QMainWindow 派生的类)和后端的东西(一个域类,从 QObject 派生)分开。这个领域类看起来像(我这么说是因为我显然不是模式的权威——总是在学习)一个外观模式。想法是在main函数中构造两个对象,然后将DomainClass的指针传递给MainWindow,即MainWindow(DomainClass *domain)。
然后就是这个问题的重点。我正在想象在域中构建许多(实际上不是很多)对象,并使它们通过信号/插槽机制进行通信。像下面这样:
QThread* threadDB = new QThread;
m_database = new Database;
m_database->moveToThread(threadDB);
threadDB->start();
QThread* threadTM = new QThread;
m_tm = new TM;
connect(m_database, &Database::dbConnected, m_tm, &TM::onDbConnected);
m_tm->moveToThread(threadTM);
connect(threadTM, &QThread::started, m_tm, &TM::init);
threadTM->start();
但我得到以下信息:
QObject::connect: Cannot queue arguments of type 'QSqlDatabase'
(Make sure 'QSqlDatabase' is registered using qRegisterMetaType().)
我注意到如果我将 m_tm 排除在线程之外,它会正常工作。像下面这样:
QThread* threadDB = new QThread;
m_database = new Database;
m_database->moveToThread(threadDB);
threadDB->start();
m_tm = new TM;
connect(m_database, &Database::dbConnected, m_tm, &TM::onDbConnected);
这样的设计合理吗?可以考虑哪些替代方案?
【问题讨论】:
-
想显示
Database::dbConnected声明? -
信号:void dbConnected(const QSqlDatabase &db);
-
最后我发现 Mandelbrot 示例非常有用,doc.qt.io/qt-5/qtcore-threads-mandelbrot-example.html
标签: qt