循环,100% CPU 使用,使用睡眠不起作用?

Posted

技术标签:

【中文标题】循环,100% CPU 使用,使用睡眠不起作用?【英文标题】:Loop, 100% CPU Usage, using sleep doesn't work? 【发布时间】:2013-02-25 21:44:52 【问题描述】:

我有一个用 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

【问题讨论】:

高 CPU 负载很奇怪。此外,Sleep() 垃圾 eax。你确定你把它放在了正确的地方吗? 根据我的逻辑,它在代码中的位置应该在循环中运行函数(检查连接)睡眠 5 秒,然后再次运行,直到建立互联网连接,或者?基本上无论我把睡眠放在哪里,该功能都会由于某种原因停止工作。 哦,好的,睡眠必须在实际检查之前进行,然后才能正常工作。 :) 我已将评论作为答案。 【参考方案1】:

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

【讨论】:

以上是关于循环,100% CPU 使用,使用睡眠不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

需要精确的线程睡眠。最大 1ms 错误

没有 100% cpu 的 C 主循环

timer_start() 睡眠后的 C 不起作用

睡眠如何消耗 CPU php [关闭]

R Sys.sleep 打印在 while 循环中不起作用

在 jQuery 中使用循环的选择器问题