2011-04-13 100 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