2013-02-25 114 views
1

我有這個小的應用程序寫在MASM,不斷檢查一個活動的互聯網連接,併發送一個嗶聲,如果有一個,現在我的問題是該循環使用99%的CPU,我試圖把睡眠內循環但不知何故,這是行不通的?循環,100%CPU使用率,使用睡眠不起作用?

這是代碼:

;build as a WINDOWS app 

     .XCREF 
     .NOLIST 
     INCLUDE \masm32\include\masm32rt.inc 
     INCLUDE \masm32\include\wininet.inc 
     INCLUDELIB \masm32\lib\wininet.lib 
     .LIST 

;------------------------------------------------------------------------- 

IsOnline PROTO :LPSTR 
Sleep PROTO STDCALL :DWORD 

;------------------------------------------------------------------------- 

IFNDEF FLAG_ICC_FORCE_CONNECTION 
FLAG_ICC_FORCE_CONNECTION EQU 1 
ENDIF 

;------------------------------------------------------------------------- 

     .CODE 

IsOnline PROC lpszURL:LPSTR 

;Test Internet Connection 
; 
;lpszURL points to a zero-terminated test URL string (must start with "http://") 
; 
;Returns EAX = FALSE if not connected 
;   = TRUE if connected 
;  EDX = connection description (see InternetGetConnectedState documentation) 

     push eax 
     mov  edx,esp 
     INVOKE InternetGetConnectedState,edx,0 
     or  eax,eax 
     jz  IsOnl0 

     INVOKE InternetCheckConnection,lpszURL,FLAG_ICC_FORCE_CONNECTION,0 

IsOnl0: pop  edx 
     ret 

IsOnline ENDP 

;------------------------------------------------------------------------- 

szURL db 'http://www.google.com',0 

;------------------------------------------------------------------------- 

_main PROC 

loop00: INVOKE IsOnline,offset szURL 
     Invoke Sleep,5000 
     or  eax,eax 
     jz  loop00 

     INVOKE Beep,750,1000 
     exit 

_main ENDP 

;------------------------------------------------------------------------- 

     END  _main 
+1

高CPU負載很奇怪。另外,Sleep()會破壞'eax'。你確定你把它放在正確的地方嗎? – 2013-02-25 21:55:07

+0

按照我的邏輯,它位於代碼中,它應該運行循環中的函數(檢查連接)5秒鐘並重新運行,直到建立Internet連接,或者?基本上,無論我睡覺,功能只是因爲某種原因停止工作。 – 2013-02-25 21:59:06

+0

哦,沒關係,睡眠必須在實際檢查之前出現,然後才能正常工作。 :) – 2013-02-25 22:06:46

回答

2

Sleep()可以垃圾桶寄存器等從IsOnline()返回值可能會丟失。