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

如何測得某一隻AP是否處於idle狀態?

尚未結案
m8815010
版主


發表:99
回覆:372
積分:289
註冊:2003-11-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-01-08 16:05:32 IP:61.63.xxx.xxx 未訂閱
請問一下: 就是現在我用程式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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-01-08 22:09:52 IP:163.29.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-01-09 09:11:38 IP:61.63.xxx.xxx 未訂閱
引言:
感謝的回覆g6101:
   
      可是我要的可能不是這樣的功能耶!
  我要的是一樣用程式A開啟一個程式B,假設B.exe被開啟後就會做一些事, 
  比如說做一個.txt檔啦…等等。
      再假設B做完這個檔後就idle在邊沒有動作了(但是程式B仍然是開啟中的)
  ,所以我希望在程式A中偵測程式B是否做完,再將它整個關閉,而不是偵測程
  式B有沒有被別人關閉。      g6101,不曉得會不會描述的很模糊…       
HomeSound
中階會員


發表:44
回覆:178
積分:94
註冊:2002-08-31

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-01-09 11:06:08 IP:61.30.xxx.xxx 未訂閱
如果A和B都是自己寫的那可以自定訊息 請搜尋"訊息傳遞" http://delphi.ktop.com.tw/topic.php?topic_id=42399 應該是您要的! --==多看.多學.多聽==--
------
--==多看.多學.多聽==--
m8815010
版主


發表:99
回覆:372
積分:289
註冊:2003-11-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-01-09 11:47:02 IP:61.63.xxx.xxx 未訂閱
引言: 感謝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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-01-09 14:32:04 IP:61.218.xxx.xxx 未訂閱
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-01-09 16:44:19 IP:61.63.xxx.xxx 未訂閱
引言: 報告版主,這樣好像不行耶! 因為: ~~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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-01-09 21:42:22 IP:163.29.xxx.xxx 未訂閱
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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-01-12 09:12:43 IP:61.63.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-02-05 14:09:38 IP:61.222.xxx.xxx 未訂閱
引言: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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-02-06 10:43:46 IP:61.63.xxx.xxx 未訂閱
引言:不好意思插一下話 看完了我有個想法 感覺上既然你的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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-03-03 13:18:28 IP:61.63.xxx.xxx 未訂閱
嗯,這個問題好像拖太久了,後來我有做進一步的研究、詢問,如:    http://delphi.ktop.com.tw/topic.php?TOPIC_ID=44825 所以先將這篇結案了,對於本篇的回應都使我獲益良多,謝謝大家,真不知要給分給誰,random吧< >! 對了,上面這篇也還未得到解答,請大家再幫幫忙吧< >!
系統時間:2024-05-06 2:43:18
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!