2015-06-22 16 views
5

ho scoperto che anche una semplice attesa sul QMutex causerà asserzione. Cosa potrei fare di sbagliato?In attesa di QMutex afferma

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 

    // ... 
} 

ottengo affermare e il messaggio di errore è:

ASSERT: 'copia' nel thread \ qmutex.cpp, linea 525

+0

Questo può avere a che fare con la 'modalità ricorsione' per QMutest. Imposta RecursionMode su Recursive durante la creazione del mutex? Il mutex – AlexanderVX

+1

dovrebbe essere un membro della classe e devi bloccarlo (usa QMutexLocker) prima di chiamare wait(). Non sono sicuro se questo è correlato all'asserzione però. –

+0

@AlexanderVX Ho provato entrambi e nulla è cambiato. – zar

risposta

0

È necessario bloccare il mutex prima chiamata waitForResponse.wait(). Il metodo SyncMgr :: onConnected() dovrebbe essere simile a questo:

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

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

    ... 
} 

è possibile trovare ulteriori informazioni qui: http://doc.qt.io/qt-5/qwaitcondition.html#wait