線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:10763
推到 Plurk!
推到 Facebook!

Q:BCB時間延遲【sleep】CreateProcess【cmdline】【bat】【exe】

答題得分者是:RaynorPao
bkgbtonxu
一般會員


發表:10
回覆:14
積分:4
註冊:2007-12-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-08-17 04:31:38 IP:140.125.xxx.xxx 訂閱
大家好.過程大概是這樣
寫一個程式,run的過程跑了CreateProcess並產生一個批次檔(.bat)輸出txt,之後還會利用txt檔內的文字運用並輸出文字。
在式產生bat的過程中,好像是產生.txt的速度比慢,在還沒產生完的時侯程式可能就已經往下跑,所以想寫一個延遲2~5的
程式來式是否是因為批次檔的問題造成取檔不ok
因為跑完程式,文件都有出來而且正確,但次一次抓不到值,第二次(檔案已產生.上一次的),在猜想可能這樣.利用
延遲程式希望能找出問題

網上大概都用sleep,但我沒辦法順利用,大概出來是這樣的結果.
Ambigquity between '_fastcall ldgbobal::Sleep(unsigned int)' and '__stdcall Sleep(unsigned long)'
看別人都好像可以順利用
exSleep(1000);//延一秒。
註:有利用HELP →SDK 加USERLIB 跟INCULE好像沒辦法
Q:
1想知道上面這個問題.解決方式。
2.CreateProcess的問題
XXX.EXE YYY.XYZ ZZZ.TXT
上方是利用文字檔產生TXT
想知道要怎麼直接利用CreateProcess產生最終ZZZ.TXT的結果.最好是不會跳出類似DOS視窗
註:目前是使用CreateProcess執行BAT 取路徑 產ZZZ.TXT但會跳出上述視窗,理想值是不跳出額外視窗【DOS】就是只有BCB的程式。

3.想知道怎麼弄一個程式/副程式來做延遲程式
目前是有使用TIMER跟DELAY原件
但感覺沒延遲,大概是把它的時間定出來,但是不知道要讓程式怎麼在主程式的某段停幾秒
主程式:RUN→DELAY1S→RUN
使用TIMER-> ->1000類似這樣。
要怎麼呼叫?程式跑那邊,我是直接加在主程式段。

------
http://www.wretch.cc/album/bkgbtonxu
編輯記錄
bkgbtonxu 重新編輯於 2008-08-21 04:35:25, 註解 修正提問【Q提問+S解答+T測式+S分享】‧
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-08-18 10:08:55 IP:210.208.xxx.xxx 訂閱
(1)有關「CreateProcess」的使用方式,請你先參考這篇文章 http://delphi.ktop.com.tw/board.php?cid=168&fid=914&tid=94575
(2)有關「Sleep();」的使用,如果發生「Ambigquity」的編輯錯誤,先試著在你的程式碼中改成這樣「::Sleep();」(前面加兩個冒號),詳細的說明可以參考這篇文章 http://delphi.ktop.com.tw/board.php?cid=168&fid=920&tid=28632
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
編輯記錄
RaynorPao 重新編輯於 2008-08-18 12:39:27, 註解 無‧
salo0610
高階會員


發表:42
回覆:120
積分:107
註冊:2003-02-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-08-18 10:49:01 IP:220.132.xxx.xxx 未訂閱

關於這問題:
Ambigquity between '_fastcall ldgbobal::Sleep(unsigned int)' and '__stdcall Sleep(unsigned long)'


前面加上 Idglobal:: 試看看!!
例如:Idglobal::Sleep(50);

===================引 用 bkgbtonxu 文 章===================
大家好.過程大概是這樣
寫一個程式,run的過程跑了CreateProcess並產生一個批次檔(.bat)輸出txt,之後還會利用txt檔內的文字運用並輸出文字。
在式產生bat的過程中,好像是產生.txt的速度比慢,在還沒產生完的時侯程式可能就已經往下跑,所以想寫一個延遲2~5的
程式來式是否是因為批次檔的問題造成取檔不ok
因為跑完程式,文件都有出來而且正確,但次一次抓不到值,第二次(檔案已產生.上一次的),在猜想可能這樣.利用
延遲程式希望能找出問題

網上大概都用sleep,但我沒辦法順利用,大概出來是這樣的結果.
Ambigquity between '_fastcall ldgbobal::Sleep(unsigned int)' and '__stdcall Sleep(unsigned long)'
看別人都好像可以順利用
exSleep(1000);//延一秒。
註:有利用HELP →SDK 加USERLIB 跟INCULE好像沒辦法
Q:
1想知道上面這個問題.解決方式。
2.CreateProcess的問題
XXX.EXE YYY.XYZ ZZZ.TXT
上方是利用文字檔產生TXT
想知道要怎麼直接利用CreateProcess產生最終ZZZ.TXT的結果.最好是不會跳出類似DOS視窗
註:目前是使用CreateProcess執行BAT 取路徑 產ZZZ.TXT但會跳出上述視窗,理想值是不跳出額外視窗【DOS】就是只有BCB的程式。

3.想知道怎麼弄一個程式/副程式來做延遲程式
目前是有使用TIMER跟DELAY原件
但感覺沒延遲,大概是把它的時間定出來,但是不知道要讓程式怎麼在主程式的某段停幾秒
主程式:RUN→DELAY1S→RUN
使用TIMER-> ->1000類似這樣。
要怎麼呼叫?程式跑那邊,我是直接加在主程式段。

bkgbtonxu
一般會員


發表:10
回覆:14
積分:4
註冊:2007-12-17

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-08-19 07:27:38 IP:140.125.xxx.xxx 訂閱
【結果與心得分享】BCB CreateProcess

功用:可利用BCB來呼叫一個外部程式(如bat.exe)並將程式結果輸出至文字檔

方法1:執行BAT檔

1.建一個記事本並利用記事本存入以下資料【執行程式.EXE >輸出.TXT】註:參考DOS語法
2.將記事本副檔名.TXT→.BAT
3.執行BAT檔並看輸出結果是有有顯示出來,若沒有輸出結果或是程式停頓沒反應大概是語法有錯。
特別要注意是是路徑對不對、空白的影響、DOS要注要的地方(比如說">"在前面要加\…等等)
4.測式OK就代到BCB CreateProcess裡面去

程式如下:

[code cpp]
AnsiString cmd = getenv("COMSPEC");
AnsiString cmdline = cmd " /c exe \>" str4;
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
// Start the child process.
CreateProcess( NULL, // No module name (use command line)
cmdline.c_str(), // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
1 CREATE_NO_WINDOW, // 0No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi ); // Pointer to PROCESS_INFORMATION structure
2 WaitForSingleObject( pi.hProcess, INFINITE );// Close process and thread handles.
3 CloseHandle( pi.hProcess );
4 CloseHandle( pi.hThread );

[/code]

註1:如果您要顯示程式跑的過程設"0"
註234:如果您不下面還有程式執行,要確定跑完的話~就加這三行吧!

【結果與心得分享】Sleep
功用:大概是程式整個停頓
測式:
MEMO1="1";
SLEEP(5000);
MEMO2="2";

Q:Ambigquity between '_fastcall ldgbobal::Sleep(unsigned int)' and '__stdcall Sleep(unsigned long)'
A:若您跟小弟一樣遭遇同樣問題,可參照上述兩位高人的方式即可解決。
結果:兩種打法都OK
1.【::SLEEP(X)】
2. 【Idglobal::Sleep(X)】
感謝兩位大大的解惑!

註:
新問題:在抓路徑的過程中,遇到了目錄空白的問題,參考站內資料是"\\"但都是人工加的~如果是cooding,該怎麼讓每個根目錄有雙\\?
ex :c:\my love\my famail\love.exe
Q1目前解決不了\\的問題
新問題:同上,在記事本中若 exe path txt若是path有空白無法產生結果 但若是exe "path" txt目前測是ok的
Q2如果加上"?【" " "錯】該怎麼打code?
------
http://www.wretch.cc/album/bkgbtonxu
編輯記錄
bkgbtonxu 重新編輯於 2008-08-19 07:38:39, 註解 無‧
bkgbtonxu 重新編輯於 2008-08-19 07:53:07, 註解 無‧
bkgbtonxu 重新編輯於 2008-08-21 04:38:30, 註解 修正CODE編排‧
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-08-19 11:43:20 IP:210.208.xxx.xxx 訂閱
(1)你會問這兩個問題,代表你對 C/C++ 程式語言的基礎還不夠熟悉,建議你多看幾本有關 C/C++ 程式語言的書籍,如果不想買書,在 Google 搜尋也可以找得到,例如:http://el.mdu.edu.tw/datacos//09512311007B/程式設計教學講義.doc
(2)反斜線「\」在 C/C 程式語言有特殊的用途,稱為「escape character」,在 (1) 中連結的 3.6 章節,就有介紹,所以當字串中必須用到反斜線「\」的時候,在程式中必須打兩個反斜線「\\」,主要是在告訴 compiler 這個字串中會有一個反斜線「\」出現,例如以下的程式碼

[code cpp]
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString AStr1="ABC";
ShowMessage(AStr1);
AnsiString AStr2="A\\BC";
ShowMessage(AStr2);
}
[/code]

(3)雙引號「"」在 C/C 程式語言也有特殊的用途,主要是在告訴 compiler 某個字串的起始與結尾,但是當字串中必須用到雙引號「"」的時候,必須配合上面講的反斜線,在程式中打「\"」,告訴 compiler 這個字串中會有一個雙引號「"」出現,例如以下的程式碼

[code cpp]
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString AStr1="ABC";
ShowMessage(AStr1);
AnsiString AStr3="\"ABC\"";
ShowMessage(AStr3);
}
[/code]

(4)有關你使用 CreateProcess 為什麼會失敗,因為你沒有查詢 MSDN 文件,裡面對於你提出的「空白」問題,就有說明 http://msdn.microsoft.com/en-us/library/ms682425.aspx,請你再參考以下的範例程式碼,自行修改

[code cpp]
void __fastcall TForm1::Button1Click(TObject *Sender)
{
DWORD rt;
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb=sizeof(si);
ZeroMemory(&pi, sizeof(pi));
AnsiString szNotepad="Notepad.exe";
AnsiString szTxtFile="C:\\temp\\d e m o\\123.txt";
AnsiString szCmdLine=szNotepad " \"" szTxtFile "\"";
if(!CreateProcess(NULL, szCmdLine.c_str(),
NULL, NULL, FALSE, CREATE_NEW_PROCESS_GROUP NORMAL_PRIORITY_CLASS,
NULL, NULL, &si, &pi))
{
ShowMessage("CreateProcess failed!");
return;
}
do
{
rt=WaitForSingleObject(pi.hProcess, 0);
Application->ProcessMessages();
Sleep(100);
} while(rt==WAIT_TIMEOUT);
if(GetExitCodeProcess(pi.hProcess, &rt))
{
ShowMessage(rt);
}
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
[/code]

(5)如果字串的內容是「"?【" " "錯】」,可以參考以下的範例程式碼,自行修改

[code cpp]
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString AStr4="\"?【\"\"\"錯】\"";
ShowMessage(AStr4);
}
[/code]
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
bkgbtonxu
一般會員


發表:10
回覆:14
積分:4
註冊:2007-12-17

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-08-21 04:30:01 IP:140.125.xxx.xxx 訂閱
【測式&結果&Q】
修正上篇發展的結果:
目前看到大多數Q的正確格式:執行程式.EXE 結果.TXT
新Q和測式
目前是用別人寫好的程式.EXE檔,內容說明使用方式【程式.EXE 路徑 影音名稱.*】
依照上述格式輸入指令後程式跑畫面正常
曾遇到的問題【1.路徑2.輸出指向>】
SOL1:
若同層直接加檔案名稱 結果正常
若加路徑
1.記得加「"」並包起來 如何加?查資料→特殊字元表示方示
2.使用函式抓路徑
3.查MSDN
4.路行【\】→【\\】
SOL2:
目前使用格式【執行程式.EXE】 【影音路徑名稱】 >【輸出記事本】
BAT方式 Q→正常 沒問題了【有路徑全包起來」
Q cmd 由於car跟ansitring轉換可能會有問題~所以有時可以~有時不行~

進諧:如果您的執行程式位置會變動~可能要另外找函式抓一下.目前還沒研究這邊~無法提供測式結果

總結:基本上小弟測式bat方式都蠻正常的~除了執行exe的位置有改的還沒解決.大概使用cp的方式大概這樣~

目前測式影音檔為mpeg若改mpg格式目前無法成功,有機會再找別台電腦試試看= =""
最後,這主題提問&分享大致如此,目前時間為20080821早上四點,
近日開始想跟大家提問、討論、分享副程式的方式,感謝大家指教^^。

註:約在星期六或日會結案,如果還有大大想補充討論可以在期限內補上^^3q
------
http://www.wretch.cc/album/bkgbtonxu
編輯記錄
bkgbtonxu 重新編輯於 2008-08-21 04:32:07, 註解 無‧
系統時間:2017-12-15 5:00:46
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!