runewalsh писал(а):Чот много букв, ну да ладно
Продакшен код публикуешь?!

Вот такой пример, чуть короче.
Что делает:
1) основной поток считывает с клавиатуры числа. Если считано число, то передаёт него в рабочий поток, который напечатает это число 11 раз.
2) рабочий поток, ждёт сигнала о начале работы. После того как сигнал получен, печатает число 11-раз и начинает ожидать следующий сигнал.
3) если следующей число набрано во время работы потока, то оно сразу же передаётся в поток (и печатается на экране).
4) если с клавиатуры введено не число, программа завершается.
Код: Выделить всё
program project1;
{$mode delphi}{$H+}
uses
{$IFDEF UNIX}cthreads,{$endif} Classes, SysUtils;
type
{ TCountThread }
TCountThread = class(TThread)
protected
procedure Execute; override;
public
ev : PRTLEvent;
num: integer;
constructor Create;
destructor Destroy; override;
end;
{ TCountThread }
procedure TCountThread.Execute;
var
i : integer;
begin
while not Terminated do begin
RTLeventWaitFor(ev);
if not Terminated then begin
for i:=0 to 10 do begin
write(num,'...');
sleep(200);
if Terminated then Break;
end;
writeln;
RTLeventResetEvent(ev);
end;
end;
end;
constructor TCountThread.Create;
begin
inherited Create(false);
ev:=RTLEventCreate;
end;
destructor TCountThread.Destroy;
begin
RTLeventdestroy(ev);
inherited Destroy;
end;
var
thr : TCountThread;
s : string;
err : integer;
k : integer;
begin
writeln('starting');
thr := TCountThread.Create;
repeat
readln(s);
Val(s, k, err);
if err=0 then begin
thr.num:=k;
RTLeventSetEvent(thr.ev);
end;
until err <> 0;
writeln('stopping');
thr.Terminate;
RTLeventSetEvent(thr.ev);
thr.WaitFor;
thr.Free;
end.
ЗЫ: со времён TP такое принято реализовывать в одном потоке с функцией keypressed и модулем crt. Помню меня уже тогда интересовал вопрос, а как сделать так, чтобы keypressed не писать в каждой строчке.
Добавлено спустя 3 часа 11 минут 32 секунды:CRobin писал(а):Гугл морозится, информация очень скудная
а вот
в вики...