在我的应用程序中,我使用以下代码创建新线程并在这些线程中执行外部应用程序:
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服务器收到的所有请求都被阻止。
我希望该进程在调用它的线程中执行,并且不会影响其他线程。有什么想法吗?
答案 0 :(得分:2)
据我了解你的问题,你的问题就在这里:
QThread* workerThread = new QThread();
Task *task = Task::createTask(Id);
task->moveToThread(workerThread);
...
workerThread->start();
task->execute();
在这里,您正在主线程中执行不在该工作线程中的任务。请注意,通过moveToThread
,所有插槽都在新线程中执行,而不是显式方法调用。
在您的代码中,task->execute();
在主线程中执行。