2

私は 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();
}
4

2 に答える 2

0

メソッドを実行する必要があるスレッドを、すべてのサブスクライバーに完了したことを警告する onDone シグナルに接続することができます。そうすれば、二重のロック チェックとメモリの並べ替えに関連する問題に遭遇することはありません。各スレッドで実行状態を維持します。

于 2011-08-17T01:40:01.037 に答える
-1

別のスレッドからの呼び出しからスレッドを保護したいと考えています。私は正しいですか?もしそうなら..

これが QMutex の目的です。QMutex は、「ロック解除」されるまでスレッドを「ロック」するインターフェースを提供し、スレッドへのアクセスをシリアル化します。作業が完了するまで、スレッドのロックを解除することを選択できます。ただし、自己責任で使用してください。QMutex は、正しく使用しないと独自の問題を引き起こします。詳細については、ドキュメントを参照してください。

ただし、問題を解決する方法は他にもたくさんあります。たとえば、@Beached は問題を解決するためのより簡単な方法を提案しています。QThread のインスタンスは、完了するとシグナルを発します。または、それが完了した場合、または完了していbool isDoneない場合は、スレッド内に作成してください。その場合は、メソッドを呼び出しても安全です。ただし、それを所有するスレッドの外で操作しないようにしてください。QThread 内でのみ操作することをお勧めします。truefalsetrueisDoneisDone

クラスのドキュメントは次のとおりです。リンク

LOL、私はあなたの質問をひどく誤解しました。ごめん。で私の 2 番目の提案を既に行っているようですbWorking

于 2011-12-18T00:27:03.133 に答える