powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Readln с таймаутом
5 сообщений из 5, страница 1 из 1
Readln с таймаутом
    #39542944
Лись
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, есть идеи как сделать чтение из консоли с таймаутом:

Код: pascal
1.
2.
Writeln('Do you want to do it? Y/N')
Readln(Char, 5)



Чтобы если юзер ничего не нажимает в течении 5 секунд, продолжить выполнение.

Ввод представляет собой один символ типа Y/N, я так понимаю стандартными функциями такое не сделать и нужно что-то типа GetAsyncKeyState в цикле?
...
Рейтинг: 0 / 0
Readln с таймаутом
    #39542974
Лись
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Отвечаю самому себе:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
uses
  System.SysUtils, Winapi.Windows;

const
  TimeOut = 5000;

function GetCharTimeOut(const DefChar: Char): Char;
var
  I: Integer;
  Handle: THandle;
  EventsRead: Cardinal;
  EventCount: Cardinal;
  InputRecord: TInputRecord;
begin
  Result := DefChar;
  Handle := GetStdHandle(STD_INPUT_HANDLE);
  while WaitForSingleObject(Handle, TimeOut) = WAIT_OBJECT_0 do
  begin
    if not GetNumberOfConsoleInputEvents(Handle, EventCount) then
      Exit;
    for I := 1 to EventCount do
    begin
      EventsRead := 0;
      InputRecord := Default(TInputRecord);
      if ReadConsoleInput(Handle, InputRecord, 1, EventsRead) then
        if (InputRecord.EventType = KEY_EVENT) and
          (InputRecord.Event.KeyEvent.bKeyDown) and
          (InputRecord.Event.KeyEvent.UnicodeChar <> #0) then
            Exit(InputRecord.Event.KeyEvent.UnicodeChar);
    end;
  end;
end;

begin
  try
    while True do
    begin
      WriteLn('Enter Y for YES or N for NO');
      WriteLn('Entered ' + GetCharTimeOut('T'));
    end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
...
Рейтинг: 0 / 0
Readln с таймаутом
    #39543056
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лись,

Один вопрос: а если перед выводом запроса пользователь кнопки понажимает в окне?
Это я к тому, что во времена досовских паскалей перед ReadKey() обычно очищали буфер клавиатуры.
...
Рейтинг: 0 / 0
Readln с таймаутом
    #39543481
Лись
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alekcvp,

Дельное замечание - стоит FlushConsoleInputBuffer добавить.
...
Рейтинг: 0 / 0
Readln с таймаутом
    #39543531
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Далеко не всегда стоит.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Readln с таймаутом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]