2009-12-04 47 views
3

假設我運行一個應用程序,此應用程序在一段時間後將被用戶關閉。有沒有可能找出程序何時退出?當我運行該應用程序時,我可以得到它的進程ID嗎?運行Windows程序並檢測它何時以C++結尾

+0

你在說什麼操作系統?你如何運行這個過程?它是你的程序通過exec,fork來運行另一個進程嗎? – 2009-12-04 11:31:23

+0

windows,我想在我的C++應用程序中運行該應用程序。 – EBAG 2009-12-04 11:32:53

回答

9

這是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(); 
} 
+0

乾淨。謝謝。有沒有辦法跟蹤CPU,I/O使用情況以及創建的進程的狀態? – 2011-03-03 11:37:34

+0

看看這個問題http://stackoverflow.com/questions/2475341/monitoring-cpu-and-disk-utilization-of-a-single-program – 2011-03-03 15:00:20

0

在在谷歌快速搜索,我發現從MSDN這兩種方法可以是有用的:

CreateProcessGetExitCodeProcess。這假設你正在你的應用程序中創建一個進程。

您可以執行輪詢方法來檢查創建的進程狀態。我從來沒有做過這種事,但對我來說似乎是一種非常奇怪的做法。

2

的CreateProcess和WaitForSingleObject的是簡單的方式來實現這一點:你從CreateProcess的獲取進程句柄,然後等待它WFSO,不要忘記關閉任何手柄你用。但是請稍等......有一個問題。問題是 - 對於GUI進程 - 這兩個進程都可能掛起。爲什麼?

問題出現是因爲您的應用程序有一個窗口,但沒有泵送消息。如果生成的應用程序使用其中一個廣播目標(HWND_BROADCASTHWND_TOPMOST)調用SendMessage,則在所有應用程序都處理完消息之前,SendMessage將不會返回到新應用程序 - 但是您的應用程序無法處理該消息,因爲它不是' t泵消息....所以新的應用程序鎖定,所以你的等待永遠不會成功.... DEADLOCK。

如果您對生成的應用程序具有絕對控制權,那麼您可以採取一些措施,例如使用SendMessageTimeout而不是SendMessage(例如,對於DDE啓動,如果有人仍在使用它)。但有些情況會導致您無法控制的隱式SendMessage廣播,例如使用SetSysColors API。 (a)將Wait分解成單獨的線程,(b)在Wait上使用超時,並在Wait循環中使用PeekMessage,以確保泵送消息,(c)使用MsgWaitForMultipleObjects API而不是WaitForSingleObject。

1

我想提一下,你實際上並不需要創建的一個過程,以便能夠等待它的終止。基本上,如果你知道它的PID,你可以這樣做:

HANDLE h = OpenProcess(SYNCHRONIZE, TRUE, pid); 
WaitForSingleObject(h, INFINITE); 

完整的示例:https://gist.github.com/rdp/6b5fc8993089ee12b44d(發表在這裏,如果你想提供的編譯版本)。

0

至少在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"); 
} 
相關問題