假設我運行一個應用程序,此應用程序在一段時間後將被用戶關閉。有沒有可能找出程序何時退出?當我運行該應用程序時,我可以得到它的進程ID嗎?運行Windows程序並檢測它何時以C++結尾
回答
這是here報價:
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <conio.h>
void _tmain(int argc, TCHAR *argv[])
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
STARTUPINFO sj;
PROCESS_INFORMATION pj;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
ZeroMemory(&sj, sizeof(sj));
sj.cb = sizeof(sj);
ZeroMemory(&pj, sizeof(pj));
// Start the child process p1.exe. Make sure p1.exe is in the
// same folder as current application. Otherwise write the full path in first argument.
if(!CreateProcess(L".\\p1.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &sj, &pj))
{
printf("Hello CreateProcess failed (%d)\n", GetLastError());
getch();
return;
}
// Start child process p2.exe. Make sure p2.exe is in the
// same folder as current application. Otherwise write the full path in first argument.
if(!CreateProcess(L".\\p2.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
{
printf("CreateProcess2 failed (%d)\n", GetLastError());
getch();
return;
}
// Wait until child processes exit.
WaitForSingleObject(pi.hProcess, INFINITE);
WaitForSingleObject(pj.hProcess, INFINITE);
// Close process and thread handles.
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
CloseHandle(pj.hProcess);
CloseHandle(pj.hThread);
getch();
}
乾淨。謝謝。有沒有辦法跟蹤CPU,I/O使用情況以及創建的進程的狀態? – 2011-03-03 11:37:34
看看這個問題http://stackoverflow.com/questions/2475341/monitoring-cpu-and-disk-utilization-of-a-single-program – 2011-03-03 15:00:20
在Windows上,您可以使用WaitForSingleObject來實現此功能。
在在谷歌快速搜索,我發現從MSDN這兩種方法可以是有用的:
CreateProcess和GetExitCodeProcess。這假設你正在你的應用程序中創建一個進程。
您可以執行輪詢方法來檢查創建的進程狀態。我從來沒有做過這種事,但對我來說似乎是一種非常奇怪的做法。
的CreateProcess和WaitForSingleObject的是簡單的方式來實現這一點:你從CreateProcess的獲取進程句柄,然後等待它WFSO,不要忘記關閉任何手柄你用。但是請稍等......有一個問題。問題是 - 對於GUI進程 - 這兩個進程都可能掛起。爲什麼?
問題出現是因爲您的應用程序有一個窗口,但沒有泵送消息。如果生成的應用程序使用其中一個廣播目標(HWND_BROADCAST
或HWND_TOPMOST
)調用SendMessage,則在所有應用程序都處理完消息之前,SendMessage將不會返回到新應用程序 - 但是您的應用程序無法處理該消息,因爲它不是' t泵消息....所以新的應用程序鎖定,所以你的等待永遠不會成功.... DEADLOCK。
如果您對生成的應用程序具有絕對控制權,那麼您可以採取一些措施,例如使用SendMessageTimeout而不是SendMessage(例如,對於DDE啓動,如果有人仍在使用它)。但有些情況會導致您無法控制的隱式SendMessage廣播,例如使用SetSysColors API。 (a)將Wait分解成單獨的線程,(b)在Wait上使用超時,並在Wait循環中使用PeekMessage,以確保泵送消息,(c)使用MsgWaitForMultipleObjects API而不是WaitForSingleObject。
提供更多控制的替代方法是使用Win32 Job API,請參閱CreateJobObject()和AssignProcessToJobObject()。這將允許您使用IO完成端口使用SetInformationJobObject()來異步監控您的衍生進程,它比您需要的更復雜並且可能更多,但它確實可以讓您更好地控制產生的進程。
我想提一下,你實際上並不需要創建的一個過程,以便能夠等待它的終止。基本上,如果你知道它的PID,你可以這樣做:
HANDLE h = OpenProcess(SYNCHRONIZE, TRUE, pid);
WaitForSingleObject(h, INFINITE);
完整的示例:https://gist.github.com/rdp/6b5fc8993089ee12b44d(發表在這裏,如果你想提供的編譯版本)。
至少在Windows上,有一些(使用不足的)C運行庫功能可用於此。 見C Run-Time Library Reference > Process and Environment Control。
具體而言,您有_spawnlp(_P_WAIT, cmdname, arg0, ..., argn, 0)
( 「產卵與參數升 IST,使用p ATH變量來查找文件」),該搜索在cmdname PATH和在當前目錄。 請注意,「遵循argn,必須有一個NULL指針來標記參數列表的末尾。」
E.g.
#include <stdio.h>
#include <process.h>
int main() {
puts("waiting");
_spawnlp(_P_WAIT, "mspaint.exe", "mspaint.exe", 0);
puts("returned");
}
- 1. 如何檢測我的Windows 8應用程序,它在Windows 8.1上運行?
- 2. 如何在Win32 C++程序在後臺運行時檢測KeyPress
- 3. 的Windows線程(C運行時,並行線程,的std ::線程)
- 4. 如何檢測程序運行時kinect何時斷開/拔出?
- 5. 在Windows運行時檢測鼠標
- 6. 程序如何檢測到它在Citrix上運行?
- 7. 檢測以Android結尾的安裝
- 8. Windows Mobile Cab安裝程序檢測.NET CF 3.5並安裝它
- 9. 檢測Windows進程和應用程序是否正在運行
- 10. 構建C#應用程序運行時並獲得結果
- 11. 檢測程序終止(C,Windows)
- 12. 使用python運行adb:執行程序並結束它
- 13. 程序如何檢測它是否作爲systemd守護程序運行?
- 14. 檢查程序是否可以在C#中運行(並運行它)的可能方法
- 15. 當郵政編碼從0開始或以0結尾時,程序不運行
- 16. 如何檢測以全屏模式運行的非Java程序?
- 17. 檢測圖像的結尾
- 18. 檢測ScrollView的結尾
- 19. 如何檢測應用程序是否在Windows RT或Windows 8 Pro上運行?
- 20. 如何檢測進程或應用程序是否正在運行並終止程序如果它不是
- 21. 在運行時檢測庫功能C
- 22. 檢測Windows機器是否運行了病毒掃描程序?
- 23. 檢測C++應用程序是在32位還是在64位Windows上運行
- 24. java - 如何打開程序並檢測程序何時關閉
- 25. 我可以用命令行上的Windows行結尾替換Unix行結尾嗎?
- 26. 在Silverlight中以編程方式檢測ScrollView的結尾?
- 27. 如何在程序運行時檢測重複值?
- 28. 運行程序而不結束它
- 29. 我可以檢測我的Windows 8應用程序是否正在運行?
- 30. C++程序在運行時
你在說什麼操作系統?你如何運行這個過程?它是你的程序通過exec,fork來運行另一個進程嗎? – 2009-12-04 11:31:23
windows,我想在我的C++應用程序中運行該應用程序。 – EBAG 2009-12-04 11:32:53