- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我读到我应该使用 worker 对象并通过 moveToThread 将其移动到线程,而不是直接从 QThread 继承。但是我找不到如何在我的对象 worker 中停止循环的解决方案。例如我有测试循环:
void CollectionWorker::doWork()
{
for (int i = 0; i < 10; ++i) {
sleep(1);
emit ping(i);
}
}
现在我将这个对象移动到线程:
worker->moveToThread(mTh);
这工作正常。但是当我调用 mTh.quit() 时,线程正在等待,直到 doWork 中的循环结束。当我直接从 QThread 继承时,然后在每个循环上我可以检查线程状态并在 thred 完成时中断循环,但不知道如何在 worker 对象中执行此操作。我可以只在工作对象中创建一些标志并将其从主线程切换吗?或者我可以找到线程所有者并检查它的状态吗?或者在启动线程之前更好,在工作对象中设置线程指针然后检查状态?最好的线程安全解决方案是什么?
问候
最佳答案
在线程对象上调用 quit() 或 exit() 将简单地结束线程的事件循环(如果有线程正在运行)。但是正如您正确指出的那样,最初的问题仍然存在。如果 worker 函数已经被事件循环执行过并且是一个具有 forever 构造的长时间运行的函数怎么办。对 quit() 或 exit() 的调用只会等待辅助函数返回。
除了使调用者可以使用公共(public)函数(这将更改内部标志)之外,还可以建议几种方法。
signals:
void signalTermination();
public slots:
void setTerminationFlag();
private:
QMutex mutex;
bool terminationRequested;
你的插槽看起来像什么。
void setTerminationFlag()
{
QMutexLocker locker(&mutex);
terminationRequested = true;
}
然后您可以在永远循环的每次迭代中检查 doWork 函数中的变量。
mutex.lock();
if(terminationRequested)
{
//break from loop and effectively doWork function
}
mutex.unlock();
使用信号和槽而不是普通成员函数的原因之一是,如果您的辅助函数在同步代码块内执行一些长时间运行的任务,则公共(public)函数将保持阻塞状态,直到它获得对同步对象的访问权限。如果您的公共(public)终止方法的调用线程是 UI 线程,这可能会产生不利影响。
使用 QThread 的 requestInterruption() 方法。此方法在线程对象中设置一个咨询标志,您可以通过 doWork() 函数中的 isInterruptionRequested() 函数调用来检查该标志。请参阅 QThread::isInterruptionRequested 中给出的以下代码片段文档。
void long_task() {
forever {
if ( QThread::currentThread()->isInterruptionRequested() ) {
return;
}
}
}
也可以在这里直接调用quit()结束线程的事件循环。
关于c++ - QThread - 如何停止 worker ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15269051/
我想写一些必须在自己的线程中工作的类。我读过这篇文章:http://wiki.qt.io/Threads_Events_QObjects。它建议移动必须在自己的线程中工作的对象,例如: TestCla
在调用所有与 QThread::finished() 信号关联的槽后,QThread::wait() 是否返回(即解除阻塞执行)? 提前致谢。 最佳答案 不,它可能会在与信号 finished() 关
我不是在打电话 exec()在我的代码中,但 timer和 QUdpSocket工作正常。是 exec()用于等待 event接着说? 更新:timer正在工作,因为我没有调用 moveToThrea
如果我创建 QThread 作为局部变量,我发现了一个奇怪的行为。 例如,下面的代码将作为单线程工作,这意味着我需要等待 10 秒,结果才会出来。 但是如果我将线程从局部变量更改为成员变量,它将作为多
I solved my issue by moving the mySubQThread run() into the myQThread run() That said, I still would
一段时间以来,我一直在使用 Qt 开发一个应用程序,在该应用程序中我必须从相机中抓取帧。相机将在与应用程序其余部分不同的线程中运行。我遵循了以下建议: http://mayaposch.wordpre
考虑以下代码片段: class ThreadA::QThread { public: ThreadA() { } void run() { myVariable = n
所以我在构造函数中有以下代码。 m_someObject = new SomeObject(); m_someObject->moveToThread(&m_thread); m_thread.sta
我有 3 个 QThreads 相互调用(全部继承自 QThread。我知道有些人可能建议使用 moveToThread,但暂时忽略这个事实)。简化的代码如下所示: Thread1 类: void T
我想知道 new QThread(this) 和 new QThread() 之间有什么区别,以及这将如何影响我的代码在使用 QThread 时的行为. 最佳答案 QThread 的父级谁执行什么没有
我是 PySide2 的新手。我只是想启动一个示例应用程序并在应用程序启动时启动一个线程,并希望在应用程序关闭时停止该线程。当我关闭应用程序时,我收到以下错误:QThread:在线程仍在运行时销毁。s
关于如何实例化和使用 QThread 的官方文档可以在这里找到: http://doc.qt.io/qt-5/qthread.html 该文档描述了两种基本方法:(1) 工作对象方法和 (2) QTh
我有以下设置: int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // Create the DBM
这是 QTread 的子对象...并在主线程中将其具体化.... 运行时错误如下: ASSERT failure in QCoreApplication::sendEvent: "Cannot sen
在过去的几天里,我一直在尝试使用 QThreads 而不对 QThread 进行子类化的新的首选方法。我遇到的麻烦是当我试图关闭我创建的一组线程时。我经常收到“线程仍在运行时已被销毁”消息(如果我在
我已经创建了这个继承自QThread的类,用于向数据库服务器发送数据,你觉得怎么样?可以改进吗? 谢谢 #ifndef QUERYTHREAD_H#define QUERYTHREAD_H#inclu
我需要在一个线程中进行无限循环。 在 this article作者写道 >you should never ever block the event loop 因为它会阻塞信号槽概念。如何在 QTh
我试图在一个单独的线程中执行一些工作,并在工作完成后停止该线程。 我已经建立了这样的连接 thread.connect( workerClass, SIGNAL( finished() ), SLOT
我有一个快速的问题。我应该创建一个小的多线程程序来从多个传感器获取数据,并且我了解 pthreads 和 qthreads。我可以访问两个图书馆。我个人偏向于使用 Qt,因为它的设计和各种功能。但是,
我需要在主线程上运行 QThread::usleep() (出于各种原因)。 但是,usleep 是受静电保护的。 我想在没有包装器的情况下使用 QThread 的 usleep 函数(我目前正在使用
我是一名优秀的程序员,十分优秀!