Есть код с циклом - счетчиком времени.
Нужно чтобы не останавливая счет времени он считывал количество нажатия определенной клавиши.
Пока не добавляю строку 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.
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));
сразу видно что с вашим способом теряется несколько миллисекунд на цикл