use*_*577 1 c++ qt multithreading
假设我有一个class cWorker : public QObject包含a SLOT listen().此对象将移至单独的线程.
主窗口包含一个class GLWidget : public QGLWidget,有一个SIGNAL request()
我如何connect跨越两个线程的信号槽?它应该是直截了当但我找不到任何示例代码.谢谢.
int main(int argc, char *argv[])
{
cWorker* worker = new cWorker();
QThread* thread = new QThread;
worker->moveToThread(thread);
QObject::connect(thread, SIGNAL(started()), worker, SLOT(work()) );
thread->start();
QApplication a(argc, argv);
MainWindow w;
GLWidget *my_gl_widget = w.findChild<GLWidget*>("widget");
// THIS DOESN'T WORK
QObject::connect(my_gl_widget, SIGNAL( request() ), worker, SLOT( listen() ));
w.show();
return a.exec();
Run Code Online (Sandbox Code Playgroud)
}
当您QObject在不同的线程中连接两个s时,Qt始终使用QueuedConnection.这意味着当发出信号时会Qt向另一个对象发送一个事件.更多信息.
问题是Qt在退出循环之前无法传递事件.
为了能够处理你需要的事件a)打破你的infinite loopin cWorker::work或b)processEvents在那里打电话.
a)打破你可以使用的循环QTimer.所以代替:
while (true) do something;
Run Code Online (Sandbox Code Playgroud)
你将会有:
void onTimer()
{
do something()
}
Run Code Online (Sandbox Code Playgroud)
b)如果需要在那里执行持久操作(计算等),可以使用QCoreApplication :: processEvents.
下面是说明processEvents从文档:
处理调用线程的挂起事件maxtime毫秒或直到没有更多事件要处理,以较短者为准. 当程序忙于执行长时间操作(例如复制文件)时,您可以偶尔调用此函数.
结论:
无限循环是您遇到问题的原因.您可以确保:如果删除此行,listen将调用插槽:
QObject :: connect(thread,SIGNAL(started()),worker,SLOT(work()));
| 归档时间: |
|
| 查看次数: |
202 次 |
| 最近记录: |