Q:BCB時間延遲【sleep】CreateProcess【cmdline】【bat】【exe】 |
答題得分者是:RaynorPao
|
bkgbtonxu
一般會員 ![]() ![]() 發表:10 回覆:14 積分:4 註冊:2007-12-17 發送簡訊給我 |
大家好.過程大概是這樣
寫一個程式,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 發送簡訊給我 |
(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 發送簡訊給我 |
關於這問題: 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 發送簡訊給我 |
【結果與心得分享】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 |
RaynorPao
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
(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 發送簡訊給我 |
【測式&結果&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, 註解 無‧
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |