QProcess:执行阻塞整个应用程序

QProcess:execute blocks entire application

本文关键字:应用程序 执行 QProcess      更新时间:2023-10-16

在我的应用程序中,我使用以下代码创建新线程并在这些线程中执行外部应用程序:

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服务器被阻止。

我期望进程在调用它的线程中执行,并且不影响其他线程。什么好主意吗?

就我对你问题的理解,你的问题在这里:

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

这里,你在主线程中执行任务,而不是在工作线程中。注意,在moveToThread中,所有的槽都在新线程中执行,而不是显式的方法调用。

在您的代码中,task->execute();在主线程中执行。