我正在使用QThread并且在其run
方法中我有一个定时器调用一个函数来执行一些需要花费一些时间的繁重操作。通常超过触发计时器的间隔(但并非总是如此)。
我需要的是保护此方法,以便只有在完成以前的工作后才能调用它。
以下是代码:
NotificationThread::NotificationThread(QObject *parent)
: QThread(parent),
bWorking(false),
m_timerInterval(0)
{
}
NotificationThread::~NotificationThread()
{
;
}
void NotificationThread::fire()
{
if (!bWorking)
{
m_mutex.lock(); // <-- This is not protection the GetUpdateTime method from invoking over and over.
bWorking = true;
int size = groupsMarkedForUpdate.size();
if (MyApp::getInstance()->GetUpdateTime(batchVectorResult))
{
bWorking = false;
emit UpdateNotifications();
}
m_mutex.unlock();
}
}
void NotificationThread::run()
{
m_NotificationTimer = new QTimer();
connect(m_NotificationTimer,
SIGNAL(timeout()),
this,
SLOT(fire(),
Qt::DirectConnection));
int interval = val.toInt();
m_NotificationTimer->setInterval(3000);
m_NotificationTimer->start();
QThread::exec();
}
// This method is invoked from the main class
void NotificationThread::Execute(const QStringList batchReqList)
{
m_batchReqList = batchReqList;
start();
}
答案 0 :(得分:0)
您可以始终拥有一个线程,该线程需要运行连接到onDone信号的方法,该信号会提醒所有订阅者它已完成。那么你不应该遇到与双锁检查和内存重新排序相关的问题。保持每个线程中的运行状态。
答案 1 :(得分:-1)
我假设你想要保护你的线程免受来自另一个线程的调用。我对吗?如果是,那么..
这就是QMutex的用途。 QMutex为您提供了一个“锁定”线程的接口,直到它“解锁”,从而序列化对线程的访问。您可以选择解锁线程,直到完成其工作。但使用它需要您自担风险。如果使用不当,QMutex会出现问题。有关详细信息,请参阅文档。
但是还有很多方法可以解决你的问题,比如@Beached建议一种解决问题的简单方法;你的QThread实例会在它完成时发出信号。或者更好的是,在你的帖子中创建一个bool isDone
,如果已经完成,则为true
,如果不是,则为false
。如果它是true
那么调用该方法是安全的。但请确保不要在拥有它的线程之外操纵isDone
。我建议你只在你的QThread中操纵isDone
。
以下是课程文档:link
大笑,我严重误解了你的问题。抱歉。看来你已经用bWorking
完成了我的第二个建议。