【发布时间】:2016-07-12 03:17:10
【问题描述】:
谁能解释线程和事件循环的区别,以及如何在 QT 应用程序中使用它。
我可以在哪里使用移动到线程并完成线程类?
【问题讨论】:
标签: multithreading qt event-handling thread-safety
谁能解释线程和事件循环的区别,以及如何在 QT 应用程序中使用它。
我可以在哪里使用移动到线程并完成线程类?
【问题讨论】:
标签: multithreading qt event-handling thread-safety
每个线程都处理自己的事件循环,您通常无需担心这一点 - 它会为您处理好,除非您有特定的理由让它独自一人。
QThread 是 Qt 提供的一个类,用于控制线程的操作。将对象“放入”该线程的方法是使用 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() 中处理它。
注意:当对象内的函数/槽 run() 结束时,您的线程不会结束(因此您不需要执行“永远”循环)。线程仅在您告诉它退出(或销毁它)时才停止,这意味着您的线程可以处于空闲状态,直到它接收到信号或事件 - 这是事件循环进入的地方 - 传入事件由事件循环内的事件循环处理QThread 类。
注意:此代码也是一个 sn-p - 它不处理线程的关闭,您可以使用其他“模板”代码。
编辑
因此事件由事件队列处理(例如鼠标点击事件,所有基本类型为 QEvent) - 更多地被系统使用,其中某些事件可能会触发信号(例如 onClicked)。信号和槽是一种不同的机制,用户更多地使用它,您可以使用 connect() 函数在槽中处理它们。这是一个更好的解释,然后我可以想出: see here
【讨论】: