![]() |
Re: 2 Threads mit Events synchonisiern
Zitat:
Dann gäbe es da auch eine ganz einfache Möglichkeit. Dein Daten-Sammel Thread posted einfach eine benutzerdefinierte Message:
Delphi-Quellcode:
const UM_DATA_UPDATE = WM_USER +1; // benutzerdefinierte Message
// Thread if neue_daten_da then // Message wird in die windowsMessage Queue gelegt; der Thread rennt ungebremst weiter PostMessage(Application.Mainform.Handle, UM_DATA_UPDATE, 0,0); // im Hauptformular procedure DATA_UPDATE(var msg: TMessage); message UM_DATA_UPDATE; // in obiger Prozedure werden dann die Daten abgeholt und evtl. auch visualisiert Zitat:
Wenn ich von einem Thread auf eine Variable eines Formulars zugreife, sieht das so aus:
Delphi-Quellcode:
AnzeigeForm.Event.SetEvent;
// bei Zugriff auf eine globale Variable entfällt natürlich AnzeigeForm. |
Re: 2 Threads mit Events synchonisiern
Auch auf die Gefahr hin, das ich an euch allen vorbei-rede, weil ich nicht richtig "zugelesen" (aka zugehört :)) habe versuch ichs noch mal. Mein Lösungsvorschlag ist der folgende:
Delphi-Quellcode:
TDataThread = class(TThread)
... bla blubber end; TVisualThread = class(TThread) ... didel dadel end; var DataAvailable : Boolean; Data : IchKennDenTypNicht; thrData : TDataThread; thrViusal : TVisualThread; procedure TDataThread.Execute(); var TempData : VonObigemTyp; begin while not suspended ot terminated do begin TempData:=WoGibtsDennHierDieDaten(); //Hier drum kümmern das "Data" solange nicht überschrieben wird, solange der andere Thread die nicht gelese n hat //danach: DataAvailable:=true; sleep(2); //Oder natürlich WaitForSingleObject oder ähnlich; aber mindestens eine 1ms schlafen, sonst (b)rennt die CPU end; end; procedure TVisualThread.Execute(); begin while not Suspended or Terminated do begin if (DataAvailable) then begin Synchronize(MachWasMitDenDaten); DataAvailable:=false; end; sleep(2); //Der "armen" CPU zuliebe :) end; end; procedure TForm1.Create(Sender:TObject); begin DataAvailable:=false; thrData:=TDataThread.Create ... thrVisual:=TVisualThread.Create ... end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz