如何測得某一隻AP是否處於idle狀態? |
尚未結案
|
m8815010
版主 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
請問一下:
就是現在我用程式A去開啟並執行另一執行檔B,之後程式B便開始run了,
那麼應該怎麼測得程式B是否run完了,這樣我才能知道可以關閉程式B了。
BCB中好像有這樣的功能的event:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Application->OnIdle=MyIdle;
}
...
void __fastcall TForm1::MyIdle(TObject* Sender,bool& Done)
{
//code here
}
可是我是想檢測別的AP,要怎麼做呢?謝謝!
|
g6101
高階會員 發表:22 回覆:129 積分:110 註冊:2002-06-15 發送簡訊給我 |
m8815010您好: 以下的程式碼應該符合您的要求,至於程式碼的出處我已忘了是那位大大所提供的,參考看看! void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString s= "C:\\Program Files\\Microsoft Office\\Office\\WINWORD.EXE"; DWORD rt; STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); si.cb=sizeof(si); ZeroMemory(&pi, sizeof(pi)); if(!CreateProcess(NULL,s.c_str(), NULL, NULL, FALSE, 0, NULL, NULL, &si,&pi)) { ShowMessage("CreateProcess failed!" IntToStr(GetLastError())); return; } do { //修改成do while迴圈來等待 rt = WaitForSingleObject(pi.hProcess, 0); //這裡不等待 Application->ProcessMessages(); Sleep(100); } while( rt == WAIT_TIMEOUT); //是否timeout? CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); ShowMessage("WinWord 結束!"); } |
m8815010
版主 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
|
HomeSound
中階會員 發表:44 回覆:178 積分:94 註冊:2002-08-31 發送簡訊給我 |
|
m8815010
版主 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
引言: 感謝HomeSound的回覆: 感謝前兩位的回覆,不是故意雞蛋挑骨頭,而是不是我想要的方式。 承之前說明,我想要的是: (1)我不想到程式B的source code去埋訊息(或其它動作)來做echo,因為不動 source code我覺得是對的(雖然我有source code) (2)我也不想用檢測程式B所產生的.txt檔是否可以access來判斷程式B是否動 作完成了(因為直覺這就不是很妥當)。 -------------------------個人推想------------------------------- 承之前說明,BCB好像對Application有Application->OnIdle這個事件, 可以在自已這個Application為idle時觸發,那我猜想只要知道 Application->OnIdle這個事件SDK的寫法或是用什麼msg觸發可能就有解 了。因為它可能有一個API函式叫 BOOL IfPrssdle(HANDLE hProcess); 這樣就可以偵測除了自已以外其它Application是否idle了。 當然並沒有這一隻函式,上面也只是我的推想。 -------------------------個人推想------------------------------- 還是要請各位幫我想想,感謝萬分! |
axsoft
版主 發表:681 回覆:1056 積分:969 註冊:2002-03-13 發送簡訊給我 |
m8815010您好: 試試WaitForInputIdle()
http://msdn.microsoft.com/library/en-us/dllproc/base/waitforinputidle.asp
void __fastcall TForm1::Button1Click(TObject *Sender) { STARTUPINFO si; ZeroMemory(&si, sizeof(STARTUPINFO)); si.cb=sizeof(STARTUPINFO); si.wShowWindow=SW_SHOWNORMAL; PROCESS_INFORMATION pi; DWORD ExitCode; if(CreateProcess(NULL, "c:\\winNT\\notepad.exe c:\\clony.Txt", NULL, NULL, FALSE, CREATE_DEFAULT_ERROR_MODE | NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi)==TRUE) { WaitForInputIdle(pi.hProcess, INFINITE); WaitForSingleObject(pi.hProcess, INFINITE); GetExitCodeProcess(pi.hProcess, &ExitCode); CloseHandle(pi.hThread); CloseHandle(pi.hProcess); } }你的應用可以去Check WaitForInputIdle()傳回的狀態跟WaitForSingleObject()來配合...應該就能達到你要的功能了.. /*生活是一種藝術,用心生活才能享受生活*/發表人 - axsoft 於 2004/01/09 14:34:04 |
m8815010
版主 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
引言: 報告版主,這樣好像不行耶! 因為: ~~other source code~~ WaitForInputIdle(pi.hProcess, INFINITE); // 這行等到被開啟的程式完成開啟才return // 以開啟BCB 6.0為例,開啟它時雖然logo立 // 刻就show出來,可是還不算是開啟完成, // 因為它還沒有完全load in memory。 WaitForSingleObject(pi.hProcess, INFINITE); // 這行等到被開啟的程式被關閉後才return // 回來,所以還是要程式被某人關閉。 ~~other source code~~ 所以這才應該是不行的! 我的問題好像說的不清楚,再把它說明白點: 就是一樣用程式A去開啟程式B,完成後程式B就idle 在那邊沒事做了,這時再用程式A去控制程式B,比 如是按一個button,而程式B被控制按下button後, 就作一些動作,比如去生成一個.txt檔,這時程式B 是unidle的,因為它一直在生成這個.txt檔中,直到 生成完成後,程式B又idle了。這時我希望程式A可以 偵測到程式B已經idle,以便關閉它。 條件還是(1)不去程式B埋echo (2)不以偵測".txt是否可以acess"取代 請版主、大家再幫助一下,謝謝! |
g6101
高階會員 發表:22 回覆:129 積分:110 註冊:2002-06-15 發送簡訊給我 |
m8815010您好:
請參考以下連結http://netcity1.web.hinet.net/UserData/nep2314/Datas/MsgExample.zip,您希望由程式A去控制程式B的button,這時需先取得窗口代碼(HANDLE),再藉由SendMessage或PostMessage API來送出訊息,達到控制的目的,再試著參考加入先進們回應的程式碼,應該可以達到您的需求。 如果試驗成功了,不要忘了把成果分享給大家
|
m8815010
版主 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
引言: g6101,不好意思啦: 你的sample不是還是一傳一收的例子嗎?可是我不想 去被控制的程式埋echo呀。 也就是說被控制的那個程式只是一個.exe的檔案,我 們沒有source code去修改、埋訊息(也不想這麼做)。 目前由程式A去開啟程式B(.exe檔)再去找到程式B的 mainform的Hwnd值,再找到要控制按下的那個button的Hwnd 值,並PostMessage按下,上面這些我都還ok,可完成。 重點是程式B被控制操作後,會生成一個.txt的檔,假如 這個.txt檔已經生成完了,因為我們沒有去程式B埋echo,所 以它不會自動通知檔案生成完畢了,而且程式B將檔案生成完 了就idle在那邊沒事做也不會自行關畢,所以我們也不能用偵 測程式B是否關閉了來表示.txt檔已經生成完畢了。 所以偵測程式B是否idle我覺得是可行的方法,也就是上述 我提到的"Application->OnIdle"這個事件,當一隻AP idle時它 會觸發,只是它是偵測本身這隻AP的,那我們要如何偵測其它隻 AP呢? 愈說愈長,g6101、版主、其它會的人,有解答的話再幫幫 我吧,感謝感謝! |
mkbobo
一般會員 發表:4 回覆:68 積分:19 註冊:2003-04-10 發送簡訊給我 |
引言:g6101,不好意思啦: 你的sample不是還是一傳一收的例子嗎?可是我不想 去被控制的程式埋echo呀。 也就是說被控制的那個程式只是一個.exe的檔案,我 們沒有source code去修改、埋訊息(也不想這麼做)。 目前由程式A去開啟程式B(.exe檔)再去找到程式B的 mainform的Hwnd值,再找到要控制按下的那個button的Hwnd 值,並PostMessage按下,上面這些我都還ok,可完成。 重點是程式B被控制操作後,會生成一個.txt的檔,假如 這個.txt檔已經生成完了,因為我們沒有去程式B埋echo,所 以它不會自動通知檔案生成完畢了,而且程式B將檔案生成完 了就idle在那邊沒事做也不會自行關畢,所以我們也不能用偵 測程式B是否關閉了來表示.txt檔已經生成完畢了。 所以偵測程式B是否idle我覺得是可行的方法,也就是上述 我提到的"Application->OnIdle"這個事件,當一隻AP idle時它 會觸發,只是它是偵測本身這隻AP的,那我們要如何偵測其它隻 AP呢? 愈說愈長,g6101、版主、其它會的人,有解答的話再幫幫 我吧,感謝感謝!不好意思插一下話 看完了我有個想法 感覺上既然你的B程式 是別人做的程式 那你可能要確定B程式它有寫這個功能 如果有寫用Spy 應該攔的到 如果沒寫~~你現在想的可能也用不到^^" 在這我想提供一個比較笨~~但是簡單的方法 就是你可以開一個THREAD去檢查它會生成的文字檔 假設當它生成了 你就可以控制它關閉 這樣是不是簡單多了 不過如果文字檔是固定名稱 而且只是增加內容 而且還是不固定的大小 我想就比較麻煩 因為不固定大小就無法得知他現在的是否結束 最後 我想如果你想攔 |
m8815010
版主 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
引言:不好意思插一下話 看完了我有個想法 感覺上既然你的B程式 是別人做的程式 那你可能要確定B程式它有寫這個功能 如果有寫用Spy 應該攔的到 如果沒寫~~你現在想的可能也用不到^^" 在這我想提供一個比較笨~~但是簡單的方法 就是你可以開一個THREAD去檢查它會生成的文字檔 假設當它生成了 你就可以控制它關閉 這樣是不是簡單多了> <>最後 我想如果你想攔> >>< face="Verdana, Arial, Helvetica"> 哇!真棒…問題還是有回覆的,我幾乎都忘了看這篇有沒有新的回覆,雖然我有持續想這個問題! >,您的意思是用〝間諜加加〞去檢測當 >)! 嗯,我還是一直覺得要用類似>OnIdle="自已寫的OnIdle事件">〝An application is idle when it is not processing code.〞。問題只是我們要偵測的是別隻Ap,所以要做幫它埋一個idle事件這樣的動作吧,或許! 別急著走,再看下去吧< >,因為我有新的線索了,昨天突然發現有一個這樣的>>( >< >< >!> |
m8815010
版主 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
嗯,這個問題好像拖太久了,後來我有做進一步的研究、詢問,如: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=44825 所以先將這篇結案了,對於本篇的回應都使我獲益良多,謝謝大家,真不知要給分給誰,random吧< >! 對了,上面這篇也還未得到解答,請大家再幫幫忙吧< >!
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |