我在QThread中有一个worker对象,在无限循环中运行一些东西。在某个地方,我看到了一个代码,例如,在工作人员中有'checkStatus()‘方法返回一些布尔值。此方法不是插槽,而是一种公共方法。我感兴趣的是,如果这个worker对象已经被移动到一个QThread中并且正在运行它的无限循环,那么从主线程调用这个方法安全吗?我不应该用信号插槽代替吗?
我在主窗口的构造函数中尝试了这样的方法:
....
startDataInputSlot(); // starting thread and moving worker into thread
while(1) dataInputWorker->checkStoppedStatus(); // trying to access some variables in worker object
....startDataInputSlot()启动一个线程并将工作人员移动到该线程中。在worker的无限循环中,它定期检查下一个无限周期(在主窗口中)试图访问的值。没有使用QMutexes,程序正常工作而不会崩溃。这个安全吗?
发布于 2015-02-13 07:13:13
直接访问没有互斥的员工成员是不安全的。这是一个如何实现它的例子:
class Worker : public QObject
{
public slots:
void doHeavyJob()
public:
bool getStatus();
private:
int data;
QMutex mutex;
}doHeavyJob是修改data变量的主要辅助函数。应该通过信号插槽机制启动它,因为在这种情况下,它将在工作线程中运行:
void Worker::doHeavyJob()
{
while (true)
{
mutex.lock();
// do something with the data
data++;
mutex.unlock();
}
}
QThread *thread = new QThread;
Worker *worker = new Worker;
worker->moveToThread(thread);
connect(thread, SIGNAL(started()), worker, SLOT(doHeavyJob()));
thread->start();在这里,您可以直接从另一个(主)线程检查worker状态:
bool Worker::getStatus()
{
bool isGood;
mutex.lock();
isGood = data > 10;
mutex.unlock();
return isGood;
}在getStatus内部,您应该锁定data变量,因为它可以在运行在工作线程中的doHeavyJob槽中进行更改。
另外,不能将getStatus函数作为插槽启动,因为只有当控件返回到工作线程事件循环时才会执行它,但是如果您有“无限”的doHeavyJob函数,它永远不会发生。
https://stackoverflow.com/questions/28484149
复制相似问题