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

偵測某視窗啟動的問題

尚未結案
DBIN
一般會員


發表:5
回覆:7
積分:2
註冊:2005-04-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-04-14 11:46:24 IP:210.66.xxx.xxx 未訂閱
各位大大安安: 有個問題想請教 ^^" 小弟寫個自動化執行 "其他程式" 的程式 //執行 MENU 上的開啟舊檔 PostMessage(handle, WM_COMMAND,MenuId, 0); HWND hwndD; //確認 開啟舊檔 視窗已啟動並取得其 Handle do{hwndD = ::FindWindowEx(NULL,NULL,NULL,"開啟舊檔");} while(!::IsWindow(hwndD)); //繼續執行下面的動作 ..... 利用 do while 的方式可以達到偵測視窗開啟的動作可是有兩個問題 1.若視窗無法開啟將造成死結 2.do while 狂跑會把 CPU 操死,降低整體執行效率 小弟想過是否另外開個執行序來做偵測的動作 例如:VB.NET 下 t.join(3000) 執行某 Thread 去判斷視窗是否開啟,若不開啟三秒後 KO 掉這個 Thread 然後傳回錯誤,請教 C 下該如何做,或者有其他更簡單的作法?感恩!! ^^"
blk5743
高階會員


發表:34
回覆:371
積分:236
註冊:2003-11-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-04-14 14:33:06 IP:61.66.xxx.xxx 未訂閱
DBIN你好 你可以在你的do~while迴圈中加一個delay的時間 如Sleep(1000);//暫停一秒 並且可以設定timeout的時間,例如60秒 則用個變數再你的迴圈每做一次加一,到60後就break; 基本上,應該不會有人無限制的等待吧
DBIN
一般會員


發表:5
回覆:7
積分:2
註冊:2005-04-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-04-14 16:01:59 IP:210.66.xxx.xxx 未訂閱
引言: DBIN你好 你可以在你的do~while迴圈中加一個delay的時間 如Sleep(1000);//暫停一秒 並且可以設定timeout的時間,例如60秒 則用個變數再你的迴圈每做一次加一,到60後就break; 基本上,應該不會有人無限制的等待吧
感謝 blk5743 前輩的建議,小弟一直不想設 Sleep 的原因是因為會造成系統效率的降低,而且可能因為電腦效能的不同處理這個事件的時間也會不一樣, 不過在迴圈設定變數若超過一定數量跳出的方法小弟會考慮,目前嘗試用 WaitForInputIdle(pi.hProcess, INFINITE); WaitForSingleObject(pi.hProcess, INFINITE); 來做,可是不知道怎ㄇ入手,若其他前輩有這部分相關的經驗或建議都希望可以提供給小弟喔,有偵測 Handle 是否出現類似上面兩個偵測 Process 的方法ㄇ^^"
rogan321
高階會員


發表:21
回覆:307
積分:200
註冊:2003-05-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-04-16 03:04:13 IP:203.204.xxx.xxx 未訂閱
可以考慮下面的方法  
 
do{
  .....
  .....
  Application->ProcessMessages(); 
  .....
}while(con)    將con設定為全域變數,並在外部控制他的值
Application->ProcessMessages();可讓迴圈不會完全佔用資源
而可讓你的cpu有機會處理其他的訊息~~
系統時間:2024-05-17 15:14:10
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!