循环,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 使用,使用睡眠不起作用?的主要内容,如果未能解决你的问题,请参考以下文章