QProcess:执行阻塞整个应用程序
QProcess:execute blocks entire application
在我的应用程序中,我使用以下代码创建新线程并在这些线程中执行外部应用程序:
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();
在主线程中执行。
相关文章:
- 按下Arduino按钮后,如何在C#应用程序上执行操作
- 计算有多少人执行我的C++应用程序
- 从Qt应用程序执行MSI文件
- 我在哪里编写在退出 C++ 窗口窗体应用程序之前执行的代码部分
- 应用程序执行器 vs lpsz用户名 ADsOpenObject.
- 执行递归函数时 C++ 应用程序崩溃
- 程序'main.exe'运行失败:指定的可执行文件不是此操作系统平台的有效应用程序
- 有没有办法在C++应用程序的多次执行中保存值?
- 应用程序在 C++ QT 上执行 sql 后崩溃
- 在 Ubuntu 16.04 的 usr/local/bin 中安装的 c++ 应用程序在从主目录执行时无法正常运行
- 注销侏儒会话时如何从Qt应用程序执行"confirm" gnome会话管理器的对话框(不使用QSessionManager)
- 停止直接执行主应用程序并从第二个应用程序执行它
- 使用InstallShield(windows)部署的C++应用程序执行错误
- 如何在不冻结应用程序 1 的情况下从另一个应用程序 1 执行应用程序 2
- 视觉 从 C++ 应用程序执行的外部程序中的 CPU 负载有限
- 如何在替换调用方并在 xp/vista/7 上运行的窗口中从我的 VS2008/C++ 应用程序执行程序
- 从 C# 应用程序执行C++函数
- Q应用程序执行分段错误
- 在Windows下编译的QT应用程序执行计算错误
- Qt中的异步应用程序执行