Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 循环,100%CPU使用率,使用睡眠模式';不行?_Winapi_Assembly_X86_Masm_Masm32 - Fatal编程技术网

Winapi 循环,100%CPU使用率,使用睡眠模式';不行?

Winapi 循环,100%CPU使用率,使用睡眠模式';不行?,winapi,assembly,x86,masm,masm32,Winapi,Assembly,X86,Masm,Masm32,我有一个用MASM编写的小应用程序,它不断检查活动的internet连接,如果有,它会发出嘟嘟声,现在我的问题是,循环占用了99%的CPU,我尝试过在循环中设置睡眠,但不知怎的,它不起作用 代码如下: ;build as a WINDOWS app .XCREF .NOLIST INCLUDE \masm32\include\masm32rt.inc INCLUDE \masm32\include\wininet.in

我有一个用MASM编写的小应用程序,它不断检查活动的internet连接,如果有,它会发出嘟嘟声,现在我的问题是,循环占用了99%的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

Sleep()
可能会损坏寄存器,因此来自
IsOnline()
的返回值可能会丢失。

高CPU负载是奇怪的。另外,
Sleep()
垃圾
eax
。你确定你把它放在正确的位置了吗?根据我的逻辑,它应该在代码中的位置运行循环中的函数(检查连接)睡眠5秒钟,然后再次运行它,直到建立internet连接,或者?基本上,无论我把睡眠放在什么地方,这个功能都会因为某种原因而停止工作。哦,好吧,睡眠必须在实际检查之前出现,然后它才能工作。:)我已经做出了回答。