不發出信號在以下代碼中省略waitForFinished()
使QProcess停止發出其信號。它有什麼問題?這是一個Qt錯誤? (5.7)。請注意,此代碼與QtConcurrent運行並行運行。但是,這不應該改變什麼,應該嗎? Afaik在其他線程發送信號很好,但它們會排隊。QProcess在不waitForFinished()
回答
你沒有運行在該QProcess
實例所在線程的事件循環。沒有事件循環的線程中的任何QObject
都只是部分功能 - 定時器不會運行,排隊的調用將不會被髮送等。所以你不能這樣做。使用QObject
與QtConcurrent::run
需要注意。
至少,只要進程處於活動狀態,就應該有一個臨時事件循環 - 在這種情況下,應該按值保存QProcess
,因爲事件循環退出後將不會執行deleteLater
。
QProcess process;
...
QEventLoop loop;
connect(process, &QProcess::finished, &loop, &QEventLoop::quit);
loop.exec();
否則,你需要保持更持久的線程的進程,並保持該線程處理(QThread
不過是手柄!),因爲有一個事件循環,當它這樣做,可以處理它的線程。
// This can be run from a lambda that runs in an arbitrary thread
auto thread = new QThread;
auto process = new QProcess;
...
connect(process, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
[this, process](int exitCode, QProcess::ExitStatus exitStatus){
...
process->deleteLater();
process->thread()->quit();
});
process->start("VBoxManage", {"list", "vms"});
process->moveToThread(thread);
// Move the thread **handle** to the main thread
thread->moveToThread(qApp->thread());
connect(thread, &QThread::finished, thread, &QObject::deleteLater);
thread->start();
唉,這是非常愚蠢的,因爲你正在創建臨時線程,這是昂貴和浪費。您應該有一個額外的工作線程,您可以負責所有低開銷工作,例如QProcess
交互。該線程應該始終運行,並且您可以將所有QProcess
和類似的對象實例從併發lambda等移動到它。
有這樣的多個工作必須完成。我使用Concurrent,因爲這樣我可以輕鬆使用所有內核。但是,爲什麼它不起作用呢?它是lambda?我調用的對象在主線程中。將使lambda成員函數工作? – ManuelSchneid3r
對不起,這聽起來很愚蠢,但不是來自已經運行事件循環的'QThreadPool'線程? (例如,爲了執行傳遞給'QThreadPool :: start'的函數) – Mike
我已經說了爲什麼它不起作用:這是因爲像'QProcess'這樣的'QObject'是可用的,線程它運行時必須運行一個事件循環!它沒有任何**與lambda或類似的東西。你調用'run'的對象是不相關的:lambda運行在沒有事件循環的工作線程中。 –
- 1. 的Qt - QProcess中不工作
- 2. QProcess中不起作用
- 3. QProcess中
- 4. 使用QProcess中
- 5. QProcess中ReadAllStandardError()
- 6. QProcess卡住了
- 7. QProcess凍結GUI
- 8. 鬆散的QProcess
- 9. QProcess :: startDetached()不顯示控制檯窗口
- 10. QProcess不顯示命令窗口
- 11. QX11EmbedContainer和QProcess問題
- 12. 關於QCoreApplication和QProcess
- 13. QProcess終端輸入
- 14. QProcess沒有輸出
- 15. 另外,QProcess和AVRDUDE
- 16. 如何使用QProcess?
- 17. 不能在QT上使用QProcess類在Windows 7上
- 18. 這是QProcess和QProcess一起使用的合適時機嗎?
- 19. qt - qprocess在循環中啓動
- 20. 在textBrowser中實時顯示QProcess輸出
- 21. QProcess如何在Linux內部工作?
- 22. 如何在後臺運行QProcess?
- 23. 在QProcess中使用QTemporaryFile是否安全?
- 24. 在QProcess啓動後發出命令
- 25. QProcess在從Qthread調用時不會退出
- 26. QProcess :: kill()不會在linux中終止子節點
- 27. QProcess中不會發出errorOccurred在VBScript中失敗
- 28. qprocess啓動外部程序
- 29. 通過QProcess打印unicode
- 30. 如何從QProcess讀取?
您是否已將所有此代碼放入傳遞給'QtConcurrent :: run'的lambda函數中? – Mike