Консультация № 56317
22.09.2006, 07:59
0.00 руб.
0 4 3
Здравствуйте.
В дос-программах для задержки назаданное к-во миллисекунд я использовал INT15h при AH=86h. В Windows 2000,XP данный метод не работает (задержки нет). Кто-нибудь знает метод для задержки, который бы работал и в DOS, и в Win9x, WinNT.

Обсуждение

Неизвестный
22.09.2006, 10:54
общий
это ответ
Здравствуйте, Sha_Lun!

Дос от Виндовс сильно отличается. Использовать ситемные программы не получиться, не получиться использовать и таймер - в 2000,ХР нет доступа к нему...
Один из вариантов (для пентиума):

FREQ equ 3000000;частота процессора (кHz)
delaytime dd 5;количество миллисекунд задержки
...
delay:
rdtsc
mov ebx,FREQ
div ebx
mov ecx,eax
@@:
rdtsc
mov ebx,FREQ
div ebx
sub eax,ecx
cmp eax,[delaytime]
jb @B
давно
Посетитель
7438
7205
22.09.2006, 12:53
общий
это ответ
Здравствуйте, Sha_Lun!
Решение, предложенное ADSota, конечно, будет работать, но у него есть
два недостатка:
1) привязано к частоте CPU
2) загрузка процессора становится равной 100%. Что особенно станет заметно при
достаточно больших задержках и частом их употреблении.
Хотя при редких и малых задержках - вполне приемлемое решение

При задержках >= 1 мс лучше использовать мультимедийный таймер
timeBeginPeriod(1) ; // где-то в начале инициируем таймер
...
timeSetEvent(1, // 1 мс
1,
(LPTIMECALLBACK)heMTimer, // событие, которое взведется по истечению времени
0,
TIME_ONESHOT | TIME_CALLBACK_EVENT_SET) ;
WaitForSingleObject (heMTimer, INFINITE) ; // ждем событие

Есть еще вариант - использовать Sleep(dwMsCount), но эту функцию можно использовать при значениях, больших 10 мс.
Да и работает с большой погрешностью. Не надо забывать, что Windows - это не
система реального времени...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
22.09.2006, 13:18
общий
это ответ
Здравствуйте, Sha_Lun!

можно использовать Sleep:

void Sleep(
DWORD dwMilliseconds
);

или использовать объекты синхронизации: таймеры, мутексы, семафоры..
Неизвестный
23.09.2006, 08:27
общий
Вы наверно чего-то недопоняли. У меня ДОС-программа! Нужно обеспечить ее работоспособность в WinNT. Я патчу программы, написанные на паскале. Исправляю CRT Delay так, чтобы он работал на быстрых машинах. Решение, которое я нашел не годится для WinNT
Форма ответа