2016-09-20 30 views
2

在我的應用程序使用下面的代碼來創建新的線程和執行那些線程的外部應用程序:另外,QProcess:執行塊整個應用程序

int main(int argc, char *argv[]) 
{ 
... 
    WebSocketServer *server = new WebSocketServer(); 
    QObject::connect(server, &WebSocketServer::closed, &a, &QCoreApplication::quit); 
    QObject::connect(server, SIGNAL(messageReceived(QJsonObject)), dm, SIGNAL(sendHandleProcessedFiles(QJsonObject))); 
    QObject::connect(dm,SIGNAL(sendServerNotify(int, QByteArray)),server,SLOT(notifySender(int, QByteArray))); 
} 

void WebSocketServer::processTextMessage(QString message) 
{ 
    QThread* workerThread = new QThread(); 
    Task *task = Task::createTask(Id); 
    task->moveToThread(workerThread); 

    QObject::connect(task, SIGNAL(workFinished()), workerThread, SLOT(quit())); 
    QObject::connect(workerThread, SIGNAL(finished()), task, SLOT(deleteLater())); 
    QObject::connect(workerThread, SIGNAL(finished()), workerThread, SLOT(deleteLater())); 
    workerThread->start(); 
    task->execute(); 
} 


void Task::execute() 
{ 
    ... 
    //Execute external program 
    QProcess process; 
    process->start(cmd); 
    process->waitForFinished(-1); 
    //Execution should continue after termination of external program within the thread created in WebSocketServer::processTextMessage 
    ... 
} 

在我的任務目標我必須執行一個外部程序,等待直到它的執行完成並繼續我的程序代碼。我希望我的線程一直等到程序執行結束,因此不需要異步機制。

我遇到的問題是不僅個別線程等待程序,而且整個應用程序被阻塞,直到程序終止。因此,例如我的websocket服務器收到的所有請求都被阻止。

我預計該進程在線程中被調用,並且不影響其他線程。有任何想法嗎?

+1

你能否提供'Task :: createTask'實現。另外,你並沒有確切指定調用QProcess :: execute的地方/方式。我懷疑在任務移動到新的QThread之前,Task :: createTask正在調用'QProcess :: execute' *。只是一個猜測。 –

+3

請提供完整的最簡單示例,而不是片段。你顯示的所有代碼都是正確的,缺少的位是非常重要的,因爲這是問題實際發生的地方。 –

+1

你最有可能在worker對象的構造函數中啓動線程。相反,你應該推遲它,直到對象準備好使用 - 即你應該通過使用零持續時間定時器來執行一個'init'插槽/函子來從事件循環中解除它。 –

回答

2

據我理解你的問題,你的問題就在這裏:

QThread* workerThread = new QThread(); 
Task *task = Task::createTask(Id); 
task->moveToThread(workerThread); 
... 
workerThread->start(); 
task->execute(); 

在這裏,你執行任務的主線程沒有在工作線程。請注意,通過moveToThread所有插槽都在新線程中執行,而不是顯式方法調用。

在您的代碼中,task->execute();在主線程中執行。

+0

我不知道。我如何在我創建的線程中執行它? – HansHupe

+1

@HansHupe一個很好的教程將是[本頁](http://blog.debao.me/2013/08/how-to-use-qthread-in-the-right-way-part-1/)。 –

+0

@HansHupe Like [this](http://stackoverflow.com/a/21653558/1329652):) –

相關問題