2012/01/05

[原創]VCL元件介紹 - TDosCommand

以往我們在執行Dos命令時,通常會採用底下兩種作法:
CreateProcess
WinExec
這兩個API,不過這兩種作法各有缺點:
必須等待執行命令結束才可以取得執行過程的內容 (如果需要記錄Log的話)
或是
另開一個不相干的 Command 視窗去執行命令,當然,運作內容也無法擷取。

ok,要等也無所謂,但常常在執行會有幾萬行結果的批次檔時,都會出現莫名的卡住,追Code時才發現 WaitForSingleObject 永遠都不會有結束的情形。

有辦法解嗎?

介紹一個新的元件(嗯,蠻新的,最後一次更新是在2003年……)

TDosCommand 底下是官方說明:
Execute a DOS program or batch file et get outputs (text in the console) via an event OnNewLine(Sender: TObject; NewLine: string; OutputType: TOutputType).


You do not need to wait the end of the execution to get outputs, you get it line by line. You can also send text to console input via the procedure SendLine(Value: string; Eol: Boolean).

做點小小的翻譯吧:
這個工具透過觸發事件的方式取得執行Dos程式/批次檔的輸出結果,
而且是一行一行即時輸出,不需要等執行檔執行結束後才能取得輸出過程內容。
你能夠使用SendLine方法送出文字到命令提示字元視窗。



執行效率和結果令人相當滿意,令人驚豔!為什麼可以這麼好用?!

執行緒,是執行緒!果然是太黯然,太銷魂了!

深入看了一下原始碼,發現 TDosCommand 的核心是使用執行緒運作的

其中 Fix 版本是增加了 Synchronize 對顯示訊息的處理

而新的官方版本則是直接對 TStringList 做處理,看起來簡潔直接

而且架構還蠻淺顯易懂的,如果想研究執行緒寫法的人也可以參考看看
(本文載自Eden的雜念溜)

沒有留言:

張貼留言