线程& Qt应用程序中的事件循环

时间:2016-03-24 13:50:07

标签: multithreading qt event-handling thread-safety

任何人都可以解释线程和事件循环中的差异,以及如何在QT应用程序中使用它。

我可以在哪里使用移动到线程并完成线程类。?

2 个答案:

答案 0 :(得分:5)

每个线程处理它自己的事件循环,你通常不需要担心这个 - 它会为你照顾,除非你有一个特定的理由让它独自存在。

QThread是Qt提供的一个类,用于控制线程的操作。 " put"的方法对该线程的对象是使用moveToThread()函数。

你不应该继承QThread类以便在线程中运行一些代码(使用moveToThread函数),继承QThread类的唯一原因是你想要改变线程控制的行为。

以下是使对象在线程内运行的基本步骤:

MyObj *myObj = new MyObj(0); // 0 = no parent if your object inherits QObject
QThread* thread = new QThread;
myObj->moveToThread(thread);
QObject::connect(thread, SIGNAL(started()), myObj, SLOT(run()));
thread->start();

一旦调用start(),线程将启动并发出启动信号,您的对象将接收它并在其槽/函数run()中处理它。

注意:当对象内的函数/ slot run()结束时,您的线程不会结束(因此您不需要执行" forever"循环)。线程仅在您告诉它退出(或销毁它)时停止,这意味着您的线程可以处于空闲状态,直到它收到信号或事件 - 这是事件循环进入的地方 - 传入事件由事件循环处理QThread类。

注意:此代码也是一个片段 - 它不处理关闭线程,还有其他"模板"您可以使用的代码。

修改

因此事件由事件队列处理(诸如所有基本类型QEvent的鼠标点击事件之类的事情) - 系统使用更多事件,其中某些事件可能触发信号(例如onClicked)。信号和插槽是一种不同的机制,用户可以使用connect()函数在插槽中处理这些机制。这是一个更好的解释,然后我可以想出: see here

答案 1 :(得分:2)

开始阅读here了解一些基本信息,并here了解完整信息。