我正在研究一種實作,以通過 QT 中的 PID 強制退出行程。我發現解決此問題的唯一方法是使用以下代碼行:
QString processToKill = "taskkill /F /PID " QString(getAppPid());
system(processToKill.toStdString().c_str());
這些行完成了它們的作業并且運行良好,我發現的唯一細節是,在執行此命令時,控制臺會快速打開和關閉(閃爍)。有什么辦法可以防止這種行為?
uj5u.com熱心網友回復:
如果您正在使用system(),則無法避免控制臺視窗偶爾閃爍。如果您使用任何其他程式,您甚至可能會看到它的視窗閃爍。
我不會詳細介紹使用system().
使用 Windows API 執行此操作的正確方法。
即便如此,你還是采取了大錘的方法。您應該首先發出信號讓行程正常終止。如果它在一兩秒鐘后還沒有這樣做,那么你才應該讓它崩潰。
SO 問題“如何優雅地終止行程”詳細說明了正確要求行程終止的幾個選項。
如果失敗了,那么你可以簡單地使用TerminateProcess()Windows API 函式殺死一個行程(這就是taskkill /f它的作用)。這是如何做到這一點的一個很好的例子:https ://github.com/malcomvetter/taskkill
相關代碼具有以下功能:
BOOL TerminateProcess(int pid)
{
WORD dwDesiredAccess = PROCESS_TERMINATE;
BOOL bInheritHandle = FALSE;
HANDLE hProcess = OpenProcess(dwDesiredAccess, bInheritHandle, pid);
if (hProcess == NULL)
return FALSE;
BOOL result = TerminateProcess(hProcess, 1);
CloseHandle(hProcess);
return(TRUE);
}
Microsoft 有一個關于終止行程的頁面,您可能也希望查看該頁面。
uj5u.com熱心網友回復:
如果這是一個 windows 程式,請創建一個使用 WinMain 入口點而不是 main 的程式,并將聯結器子系統設定為 windows 而不是控制臺。
僅僅因為它使用 WinMain 并不意味著你必須創建一個視窗,它僅僅意味著你不會自動獲得一個控制臺。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/509848.html
標籤:C qt
