2015-06-22 5 views
5

Odkryłem, że nawet proste oczekiwanie na QMutex spowoduje asercję. Co ja mogę robić źle?Oczekiwanie na QMutex zapewnia

QMutex mutex; 

SyncMgr::SyncMgr(QObject *parent) : QObject(parent) 
{ 
    moveToThread(&thread ); 

    thread.start(); 

    process = new QProcess(this); 

    connect(process, SIGNAL(readyReadStandardOutput()), this, SLOT(onReadyReadStandardOutput())); 
    connect(process, SIGNAL(readyReadStandardError()), this, SLOT(onReadyReadStandardError())); 
} 

SyncMgr::~SyncMgr() 
{ 
    delete process; 
} 

void SyncMgr::onConnected() 
{ 
    cmdDispatcher.sendGetSerialNo(); 

    // this asserts 
    waitForResponse.wait(&mutex); // waitForResponse is CWaitCondition object 

    // ... 
} 

mogę twierdzić, a komunikat o błędzie jest:

ASSERT: 'kopia' w gwint \ qmutex.cpp, linia 525

+0

Może to mieć do czynienia z 'trybu rekursji' dla QMutest. Czy ustawiasz RekursionMode na Recursive podczas tworzenia mutex? – AlexanderVX

+1

mutex powinien być członkiem klasy, i musisz go zablokować (użyj QMutexLocker) przed wywołaniem wait(). Nie jestem pewien, czy jest to związane z twierdzeniem. –

+0

@AlexanderVX Próbowałem obu i nic się nie zmieniło. – zar

Odpowiedz

0

trzeba zablokować muteks przed wywoływanie waitForResponse.wait(). Sposób SyncMgr :: onConnected() powinna wyglądać następująco:

void SyncMgr::onConnected() 
{ 
    cmdDispatcher.sendGetSerialNo(); 

    mutex.lock(); 
    waitForResponse.wait(&mutex); 
    // do something 
    mutex.unlock(); 

    ... 
} 

można znaleźć więcej informacji tutaj: http://doc.qt.io/qt-5/qwaitcondition.html#wait