Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   2 Threads mit Events synchonisiern (https://www.delphipraxis.net/52892-2-threads-mit-events-synchonisiern.html)

shmia 6. Sep 2005 16:59

Re: 2 Threads mit Events synchonisiern
 
Zitat:

Zitat von Osse
Mein Hauptformular ist mein Hauptthread (Thread 1)in dem die Anzeige gemacht wird. Das Heißt ich müsste doch eine Funktion schreiben, die dann ausgeführt wird, so wie bei einem Interrupt (komme aus der uC Welt). Also eine Procedure für das Event, so wie Button on Klick. Nur wie lautet der Funktionsaufruf, hab in den Methoden nix gefunden :wall: .

Der 2. Thread guckt die ganze Zeit nach den Eingangsdaten.

Achso, du nimmst den Hauptthread, um die Daten anzuzeigen.
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:

Zitat von Osse
Wieso schreibst du immer ...Event das muss doch immer gleich heißen oder? Wenn du es mit FEvent angelegt hast, dann muss es auch FEvent bleiben, oder und kann nicht ich-mach-was-ich-will-Event werden??

Weil FEvent entweder eine globale Variable oder eine Variable eines Formulars ist.
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.

chaosben 7. Sep 2005 05:33

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.
Seite 2 von 2     12   

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