Aplikacja jest napisana w Delphi XE.Synchronizacja/wysyłanie danych między wątkami
Mam dwie klasy, TBoss i TWorker, które są oparte na TThread. TBoss to pojedynczy wątek, który uruchamia, a następnie utworzy około 20 wątków TWorker.
Kiedy boss tworzy instancję TWorkera, przypisuje mu metodę wywoływania synchronizacji, kiedy Pracownik skończył z tym, co robi, nazywa tę metodę, która pozwala Szefowi uzyskać dostęp do rekordu pracownika.
Jednak czuję, że to jest problem, wywołanie synchronizacji wydaje się blokować całą aplikację - blokowanie głównego wątku (ui). Naprawdę powinien po prostu zsynchronizować tego pracownika z wątkiem szefa ....
Wcześniej używałam wiadomości/spakowanych rekordów do wysyłania treści między wątkami, które działały dobrze. Jednak robienie tego w ten sposób jest o wiele czystsze i ładniejsze ... po prostu bardzo blokujące.
Czy istnieje sposób na wywołanie Syncronize w pracownikach, aby tylko czekać na wątek szefa?
Mój kod:
type
TWorker = class(TThread)
private
fResult : TResultRecord;
procedure SetOnSendResult(const Value: TNotifyEvent);
....
....
public
property OnSendResult: TNotifyEvent write SetOnSendResult;
property Result : TResultRecord read fResult;
....
end;
...
...
procedure TWorker.SendBossResults;
begin
if (Terminated = False) then
begin
Synchronize(SendResult);
end;
end;
procedure TWorker.SendResult;
begin
if (Terminated = false) and Assigned(FOnSendResult) then
begin
FOnSendResult(Self);
end;
end;
Wtedy w moim wątku Boss zrobię coś takiego
var
Worker : TWorker;
begin
Worker := TWorker.Create;
Worker.OnTerminate := OnWorkerThreadTerminate;
Worker.OnSendResult := ProcessWorkerResults;
Więc mój szef ma wówczas metoda nazywa się ProcessWorkerResults - to co zostaje uruchomiony na Synchronizuj (SendResult); pracownika.
procedure TBoss.ProcessWorkerResults(Sender: TObject);
begin
if terminated = false then
begin
If TWorker(Sender).Result.HasRecord then
begin
fResults.Add(TWorker(Sender).Result.Items);
end;
end;
end;
Która wersja Delphi jest (jest kilka nowych opcji od 2009)? – mjn
Delphi XE - dziękuję – Wizzard
Twierdzę, że używanie komunikatów do przekazywania danych między wątkami, które nie wymaga mechanizmu "synchronizacji" aplikacji (jest w "strukturze" wątków), jest dużo bardziej eleganckie niż używanie prymitywów synchronizacji wokół współdzielonych danych. – Misha