sleep的地方都是借助於ping來實現,因為windows的ping在發每個包之間都會呼叫kernel32!sleep來掛起1秒鐘。最有意思的是在給sleep傳遞引數的時候還會扣掉通訊往返所花的時間,所以非常精確。這部分反彙編出來是這樣的:
010020fe b8e8030000 mov eax,3e8h ;1000ms
01002103 8b7608 mov esi,dword ptr [esi+8] ;取出icmp包往返所花的時間
01002106 3bf0 cmp esi,eax ;ping 127.0.0.1當然不會超過1000ms
01002108 7309 jae ping+0x2113 (01002113)
0100210a 2bc6 sub eax,esi ;減去通訊耗時
0100210c 50 push eax
0100210d ff1528100001 call kernel32!sleep
假設需要
sleep 10秒,就可以這樣寫:
set sleep=ping 127.0.0.1 -n
%sleep% 11 > nul
不過前幾天我看到了更奇技淫巧的辦法,不依賴任何外部命令,純用批處理實現
sleep,能精確到0.01秒,可惜已經無法考證出原始作者了。這是個2秒的例子:
@echo off
setlocal enableextensions
call :procdelay 200
echo %time%
goto :eof
:procdelay delaymsec_
setlocal enableextensions
for /f "tokens=1-4 delims=:. " %%h in ("%time%") do set start_=%%h%%i%%j%%k
:_procwaitloop
for /f "tokens=1-4 delims=:. " %%h in ("%time%") do set now_=%%h%%i%%j%%k
set /a diff_=%now_%-%start_%
if %diff_% lss %1 goto _procwaitloop
endlocal & goto :eof
:eof
2007.09.04補:windows 2003中新增了timeout命令,功能類似sleep,還可以顯示倒計時。
批處理 sleep處理
echo off echo q debug nul echo bj jzh 0x ppppppa de dm do dh ls lu lx lezrr eeeuyrx2dx sleep.com echo 0dxfp,0xx.t0p,xtgsb4o piyu wwx0gwuy wv ovbx2gv0e...
批處理實現sleep
linux的shell裡,提供了sleep命令,參考了不少前輩的帖子,我也用批處理實現了sleep。sleep.bat echo off setlocal echo time call sleep 1 echo time endlocal goto eof sleep setlocal enable...
完美的代價
問題描述 回文串,是一種特殊的字串,它從左往右讀和從右往左讀是一樣的。小龍龍認為回文串 才是完美的。現在給你乙個串,它不一定是回文的,請你計算最少的交換次數使得該串變成乙個完美 的回文串。交換的定義是 交換兩個相鄰的字元,例如 mamad 第一次交換 ad mamda 第二次交換 md madma ...