Я хотел бы обновить Treenode.text (с истекшим временем) и использовать таймер из того же потока. Поскольку я читал его, не рекомендую использовать TTimer * в потоке, но потом, что использовать вместо этого? Спасибо.Синхронизация и синхронизация VCL (в/из потока)
* Я хочу использовать некоторое время вместо сна(). Не только потому, что то будет сырный (?), Но я должен, потому что в противном случае я могу обновить treenodetext только в каждых сек.) >>
unit master_slave
...
Tsrch_slave_thread = class(TThread)
protected
procedure Execute; override;
public
master: TMaster;
end;
TMaster = class(TObject)
private
...
FMasterNode: TTreeview;
Fsw: TStopWatch;
Fslave_search_thread : Tsrch_slave_thread;
...
end;
...
implementation
...
procedure Tsrch_slave_thread.Execute;
var
searchactive: integer;
begin
while not terminated do begin
searchactive := master.CMD_LISTCNT
if searchactive = 1 then //(master.CMD_LISTCNT's return value = 1, if master finished search on the bus)
exit;
sleep(1000); //dont want to flood the master with UDP packets... (master.CMD_LISTCNT sends UDP packets)
synchronize(procedure begin
with FmasterNode do
text := text + floattostr(Fsw.ElapsedMilliseconds/1000);
end);
end;
end;
+1. Это правильный способ обработки ожиданий при выполнении определенного действия. 'Sleep' или таймеры должны использоваться только для обработки чего-либо, основанного на * определенном времени *; при ожидании на дискретном событии используйте ожидаемый сигнал. –
@Mason этот код ждет определенный период времени –
@LU RD, Спасибо. (Почему я не могу позвонить бесплатно на TStopWatch?) – grinner