2011-04-13 60 views
2


我需要在Qt(4.7.3,Windows XP)中实现临界区域。实现Qt临界区域

例如,公共时隙:

void MyClass::myPublicSlot(...local params...)
{

...
block of code working with global params;
...

}

功能void myPublicSlot开始由计时器。
执行此功能可能需要很长时间,有时甚至超过计时器滴答声(或者,例如,按钮点击)。需要锁block of code working with global params
函数调用可以是多线程和单线程的。

P.S.我尝试过使用QMutex和QMutexLocker,但是它在单线程情况下导致死锁。

+0

你的函数是递归的吗?然后你需要使用递归QMutex。否则,你的程序的语义有点不对。 – hirschhornsalz 2011-04-13 20:29:49

回答

4

QMutex是你想要的。也许你正在递归使用它,但不会创建一个递归互斥量?这是单线程代码中死锁的唯一解释。

+0

函数不递归。 但它包含qApp-> processEvent(),使其可以运行多次。 – 2011-04-14 19:18:40

+0

谢谢! It works: ... private: > mutable QMutex* mutex; ... ... //! Button click handler void MainWindow::on_pushButton_clicked() { QMutexLocker locker(mutex); Q_UNUSED(locker); qDebug() << "Start"; qint64 t = QDateTime::currentMSecsSinceEpoch(); // wait 10 seconds for (int i = 0; i < 10; ++i) { while (QDateTime::currentMSecsSinceEpoch() - t < (i + 1)*100) qApp->processEvents(QEventLoop::AllEvents, 90); qDebug() << i; } qDebug() << "Stop"; } ... 2011-04-14 19:31:11