Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Readln с таймаутом / 5 сообщений из 5, страница 1 из 1
27.10.2017, 07:17:26
    #39542944
Лись
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Readln с таймаутом
Коллеги, есть идеи как сделать чтение из консоли с таймаутом:

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



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

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

Код: 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
27.10.2017, 10:55:12
    #39543056
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Readln с таймаутом
Лись,

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

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


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