2011-09-22 88 views
0

我正在尋找使用Win32 API來構建任務監視器/管理器。它將通過一個命令行參數來啓動(最好是一個windows服務),指定一個新進程應該啓動多少個實例。C++中的任務監視器和管理器

task_man.exe 40 

將啓動過程

task.exe 

現在,每當task.exe退出(正確與否),我將不得不開始一個新的來取代它的40個實例。

我粗略的想法是這樣的:

開始從task_man任務,得到他們的PID,然後有一個循環,檢查的PID是否所有活動進程。對於每個無效的PID,開始一個新的過程,並用新的過程替換舊的PID。

有沒有更好的設計,我可以使用,或更好的工作流程?有沒有一個標準的方法來做到這一點?我不想重新發明輪子......另外,我應該看看哪些API?

我也在尋找一個設計,很容易事後發生變化 - 也就是說,如果我跑

task_man.exe 30 

之後,一個新的task_man不應該開始運行,而是應該改變的任務數在前面的例子中。 (我知道它會開始運行,我說它應該修改原來的,然後退出)

我不是在尋找代碼(因爲我不是在尋找完整的實現,而不是我介意看樣品),而是我可以使用什麼API,或對我提出的整體設計提出建議。

+0

你說你「不要代碼」,但這只是懶惰,當你可以仔細閱讀開源程序。如果你在他們的範例中成爲文化人,你甚至可能意識到你正在進行的努力可以更好地表達爲他人工作的擴展。閱讀一些代碼,查看他們使用的API,然後閱讀這些API的文檔。也許是一個很好的開始:http://processhacker.sourceforge。net/ – HostileFork

+0

@Hostile我編輯了我的問題。 –

+0

如果他們使用您在相關平臺上理解的語言,請不要害怕完整的實現。完整的實現往往會帶來很多「真正」的擔憂,即單純的樣本會被忽略。人們使用工具開發多年的產品通常比StackOverflow上的驅動式答案要深刻得多。潛入,環顧四周,建立別人的代碼庫並逐步完成它......這是一件好事。 – HostileFork

回答

2

判斷進程是否已退出的最簡單方法是等待其句柄。你可以做到這一點在幾個方面:

  1. 構建所有的進程句柄的數組,並使用WaitForMultipleObjects(bWaitAll爲FALSE),以等待所有的人。然後,當你的代碼繼續時,你必須找出哪個進程結束了,創建一個新的,更新數組並再次等待。
  2. 運行40個線程,每個線程創建一個進程並無限等待其一個句柄(使用WaitForSingleObject)。然後,當該任務結束時,該線程將負責創建一個新的並等待它。
  3. 如果您不想創建40個線程,只需要在每個進程句柄(使用WFSO)上等待很短的時間,然後檢查返回值。您的程序將以這種方式響應速度較慢,但​​識別已結束的進程會更容易,並且您不會創建多個線程。
+0

我做了2號,它的功能就像一個魅力。謝謝。 –

1

如果要用等待操作替換池,可以使用WaitForSignalObject/WaitForMultipleObjects創建進程。進程句柄在進程退出時發出信號。與池不同,等待操作不會佔用CPU。等待線程處於非活動狀態,除非其中一個對象發出信號。