Пассивное ожидание нажатия определенной клавиши.

Есть код с циклом - счетчиком времени. Нужно чтобы не останавливая счет времени он считывал количество нажатия определенной клавиши. Пока не добавляю строку 27 (klav:=readkey;), счетчик времени идет нормально. После добавления строки 27, он останавливаться и выполнение цикла завязывается на нажатие любой клавиши.

program test;
uses crt;
label start_1, end_1, loop_1, loop_2;
var klav:char;
	msec, sec, min, hr:integer;
	cnt0, cnt1:integer;

begin
msec := 0;
sec := 0;
min := 0;
hr := 0;
cnt0 := 0;
cnt1 := 0;

start_1: // Метка
clrscr;

if msec=10 then begin msec:=0; sec:=sec+1; end;
if sec=60 then begin sec:=0; min:=min+1; end;
if min=60 then begin min:=0; hr:=hr+1; end;

writeln('Текущее время : ',hr,'н:',min,'м:',sec,'с:',msec,'00мс');
writeln('Нажатий A: ',cnt0);
// writeln('Нажатий B: ',cnt1);

klav:=readkey;
//	if klav='a' then begin cnt0:=cnt0+1; end;
//	if klav='b' then begin cnt1:=cnt1+1; end;

Delay(100);
msec:=msec+1;

goto start_1;

end_1:
writeln('Завершение программы.');
readln;
end.

Нужно проверять, нажата ли хоть какая-то клавиша. Замените фрагмент

klav:=readkey;
//	if klav='a' then begin cnt0:=cnt0+1; end;
//	if klav='b' then begin cnt1:=cnt1+1; end;

на

if KeyPressed() then
begin
    klav := readkey;
    if klav = 'a' then cnt0 := cnt0 + 1;
    // if klav='b' then begin cnt1:=cnt1+1; end;
end;
1 лайк

может лучше тогда в разные потоки развести?

var
  cnt0, cnt1: integer;

procedure KeyReading;
begin
  while true do
  begin
    var klav := System.Console.ReadKey(true).KeyChar;
    if klav = 'a' then begin cnt0 := cnt0 + 1; end;
    if klav = 'b' then begin cnt1 := cnt1 + 1; end;
  end;
end;

begin
  var msec := 0;
  var sec := 0;
  var min := 0;
  var hr := 0;
  cnt0 := 0;
  cnt1 := 0;
  
  (new System.Threading.Thread(KeyReading)).Start;
  
  while true do
  begin
    System.Console.Clear;
    
    if msec = 10 then begin msec := 0; sec := sec + 1; end;
    if sec = 60 then begin sec := 0; min := min + 1; end;
    if min = 60 then begin min := 0; hr := hr + 1; end;
    
    writeln('Текущее время : ', hr, 'н:', min, 'м:', sec, 'с:', msec, '00мс');
    writeln('Нажатий A: ', cnt0);
    writeln('Нажатий B: ', cnt1);
    
    Sleep(100);
    msec := msec + 1;
  end;
  
  writeln('Завершение программы.');
  readln;
end.

ну а вообще время лучше считать System.DateTime потому что с твоим способом будут задержки, а System.DateTime сравнивает с общим временем на компьютере

тогда в начале программы var StartTime := System.DateTime.Now; и в цикле writeln('Текущее время: ', (System.DateTime.Now-StartTime));

сразу видно что с вашим способом теряется несколько миллисекунд на цикл