Может кто-нибудь из старожил (разработчиков) FAR проявит снисхождение ко мне кодеру/лузеру и подскажет , почему у меня проблемы с функцией ReadConsoleInput на Win9x. Почему обратился к вам? FAR не имеет этих проблем , но я не вижу в исходном коде FAR что-то, что могло бы подсказать мне и изменить поведение. Проблема в том , что на Win9x рандомно возникают фризы. То есть , функция ReadConsoleInput при удержании клавиши (например стрелок) может 10-20 раз выполниться за 30-100мс , а потом резкий тормоз до 500-600мс , потом опять 30-80мс и так далее. Когда функция возвращается за время от 250 и больше , то консоль на короткое время как будто застывает.
Что я пробовал:
1) Менять ReadConsoleInput на PeekConsoleInput+FlushConsoleInputBuffer
2) Добавлять просто дополнительно в начало и/или в конец FlushConsoleInputBuffer для дополнительной очистки буфера
3) Ставить кол-во получаемых записей не 128 , а больше или меньше вплоть до одной
4) Добавлял WaitForSingleObject , чтобы срабатывало событие по нему
5) Добавлял GetNumberOfConsoleInputEvents , чтобы знать сколько событий в буфере и именно столько вызовов делал ReadConsoleInput
6) Менял создание хендла GetStdHandle на CreateFile , хендлы создавал и для OUTPUT выводя через WriteConsole, думая что может встроенный рантайм мозги пудрит
Все это проделывал в разных комбинациях , но все тщетно.
Но если взять FAR версии 1.65-1.70 , то там в редакторе нет фризов.
Подскажите пожалуйста, в чем секрет?
Вот простой исходный код:
Code: Select all
#include <windows.h>
#include <stdio.h>
int main(void)
{
HANDLE hStdInput,hStdOutput;
INPUT_RECORD ir[128];
DWORD nRead;
int blnLoop=1;
int iCount;
hStdInput=GetStdHandle(STD_INPUT_HANDLE);
hStdOutput=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleMode(hStdInput , ENABLE_WINDOW_INPUT);
FlushConsoleInputBuffer(hStdInput);
do
{
iCount = GetTickCount();
if (ReadConsoleInput(hStdInput,ir,128,&nRead))
{
iCount = GetTickCount()-iCount;
if (iCount>100)
{
printf("Slow = %d\r\n", iCount);
}
else
{
printf("%d\r\n", iCount);
}
if (ir[0].EventType ==KEY_EVENT && ir[0].Event.KeyEvent.wVirtualKeyCode==VK_ESCAPE)
blnLoop=0;
};
}
while (blnLoop==1);
return 0;
}