全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2870
推到 Plurk!
推到 Facebook!

VCL元件介紹 - TDosCommand

 
GrandRURU
站務副站長


發表:235
回覆:1655
積分:1753
註冊:2005-06-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2012-01-06 08:54:59 IP:59.120.xxx.xxx 未訂閱
以往我們在執行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的雜念溜)
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2012-01-07 00:48:00 IP:122.126.xxx.xxx 訂閱
謝謝分享! 讚!
------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
g9221712
高階會員


發表:144
回覆:344
積分:162
註冊:2006-07-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2012-08-24 00:24:34 IP:123.240.xxx.xxx 訂閱
前輩:
請教一下若要改成支援XE2 不知道要如何修改,因為我掛上去後,發現很多要轉型?
如下
[code delphi]
implementation
type
// type TCharBuffer = array[0..MaxInt - 1] of Char;
TCharBuffer = array [0 .. MaxInt - 1] of AnsiChar;

[/code]

如下
[code delphi]
implementation
type
// type TCharBuffer = array[0..MaxInt - 1] of Char;
TCharBuffer = array [0 .. MaxInt - 1] of AnsiChar;

[/code]

卡在409行不會改

[code delphi]
if not(CreateProcess(nil, app_spawn, nil, nil, True,
{ CREATE_NEW_CONSOLE }{ DETACHED_PROCESS }
CreationFlagValues[Ord(FCreationFlag)] or FPriority, nil, nil, si, pi))

[/code]

出現
[DCC Error] DosCommand.pas(409): E2010 Incompatible types: 'PWideChar' and 'PAnsiChar'


------
「人們所以覺得寂寞,是因為他們會築牆,卻不會搭橋。」
程式寫的越久,卻發現自己越來越不會寫程式!
GrandRURU
站務副站長


發表:235
回覆:1655
積分:1753
註冊:2005-06-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2012-08-24 13:06:42 IP:59.120.xxx.xxx 未訂閱
Line 211:
type TCharBuffer = array[0..MaxInt - 1] of AnsiChar;

Line 386:
Str := Str string(pBuf^[i]); //add a character
Line 410:
pBuf^[II - 2] := AnsiChar(InputLines[0][II]);

改完後編譯沒有報錯,但能不能正確執行就不知道了

===================引 用 g9221712 文 章===================
前輩:
請教一下若要改成支援XE2 不知道要如何修改,因為我掛上去後,發現很多要轉型?
如下
[code delphi]
implementation
type
// type TCharBuffer = array[0..MaxInt - 1] of Char;
TCharBuffer = array [0 .. MaxInt - 1] of AnsiChar;

[/code]

如下
[code delphi]
implementation
type
// type TCharBuffer = array[0..MaxInt - 1] of Char;
TCharBuffer = array [0 .. MaxInt - 1] of AnsiChar;

[/code]

卡在409行不會改

[code delphi]
if not(CreateProcess(nil, app_spawn, nil, nil, True,
{ CREATE_NEW_CONSOLE }{ DETACHED_PROCESS }
CreationFlagValues[Ord(FCreationFlag)] or FPriority, nil, nil, si, pi))

[/code]

出現
[DCC Error] DosCommand.pas(409): E2010 Incompatible types: 'PWideChar' and 'PAnsiChar'


系統時間:2017-12-18 7:30:17
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!