Вы можете использовать PIT в качестве таймера. Я использовал его здесь:
это мины в старых Turbo C ++ и MS-DOS .Для получения дополнительной информации о PIT см .:
есть ссылки на PIT справка и примеры Я рекомендую вам посмотреть PCGPE .
Теперь вернемся к вашему вопросу.Вы должны зарегистрировать PIT ISR подпрограмму, выполняющую ваше время / тайм-аут в фоновом режиме ... Вот пример, который я только что отключил в DOSBOX :
#include <dos.h>
#include <conio.h>
#include <iostream.h>
int stop=0;
int timeout_cnt=0;
const int int_PIT=0x08;
void interrupt (*isr_PIT0)(...)=NULL; // original ISR handler
void interrupt isr_PIT(...) // new ISR handler
{
isr_PIT0(); // call original handler
// here do your stuff
if (timeout_cnt) timeout_cnt--;
else stop=1;
}
void main()
{
clrscr();
isr_PIT0=getvect(int_PIT); // store original ISR
setvect(int_PIT,isr_PIT); // set new ISR
cout << "start counting" << endl;
stop=0;
timeout_cnt=(3*182)/10; // init timeout 18.2Hz -> 3 sec
for (;!stop;)
{
// here do your stuff
}
cout << "timeouted" << endl;
setvect(int_PIT,isr_PIT0); // restore original ISR
getch(); // this is duplicated just to avoid DOSBOX glitches
getch();
getch();
}
Вам в основном нужно простоdos.h
Все остальное - только для печати и работы с клавиатурой.
Итак, я создал ISR , который подключается к PIT , который вызывается с частотой 18,2 Гц.Тайм-аут инициируется установкой timeout_cnt
значения времени ожидания и сбросом stop
:
stop = 0;
timeout_cnt = time[sec] * 18.2;
, портированного на целое число ... после того, как счетчик опустится, он устанавливает значение stop
в значение true.Я также называю оригинальный обработчик ISR , так как MS-DOS передает его.Не забудьте восстановить исходное значение ISR до выхода из приложений.
кстати timeout_cnt
и stop
переменные должны быть volatile
, но IIRC это не имеет значенияв старом Turbo C ++ , поскольку нет никаких оптимизаций, которые могли бы их оптимизировать, если говорить о них.
В случае, если вы измените частоту PIT , вы должны вызвать оригинальный обработчик с18.2 Hz
и восстановите исходную PIT частоту до выхода из приложений.
Это также может быть использовано как своего рода многозадачность, так как вы можете делать вещи и в обработчике ISR (независимо от основного кода).) но вы должны быть осторожны, так как основной код может быть приостановлен в любое время, например, в середине записи строки на экран, и если ваш фоновый материал тоже печатается, вы можете иметь искаженный вывод и т. д., поэтому аналогичные правила, как в многопоточностиприменяется.