Autor Beitrag
GuaAck
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 376
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: Mo 27.05.13 22:27 
Hallo,

ich möchte komplex berechnete Daten grafisch in einer TPaintbox (o.ä.) im Hauptformular anzeigen. Die Daten werden in einem eigenen Thread berechnet, schon, damit die Menüs ansprechbar sind.

Im Thread schreibe ich die berechneten Daten in einen Puffer. Mein Problem: Wenn der Puffer voll ist, dann soll der Thread warten, so dass das Hauptprogramm Zeit hat, den Puffer zu leeren. Ich wollte das mit einer Message lösen (s. u.), aber bleibe bei der Schleife "application.processmessages" in einer Dauberschleife hängen. Wahrscheinlich bewirkt processmessages keinen Thread-Wechsel, wein keine Messages da sind, auch durchaus logisch. Aber warum gehen dann Clicks im Mainmenue? Wenn der Puffer nie voll läuft, dann geht es.

Hat jemand eine Erklärung? Mit Semaphoren und Mutex würde das Problem sicher lösbar, scheint mir aber mit "Kanonen nach Spatzen geschossen" (Redensart, ich liebe Spatzen!)

Grüße
GuaAck


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
Program Main;
TYPE
Txx=Tclass(TForm);
    PROCEDURE Leere_Puffer(VAR m: integer); MESSAGE WM_USER + 1;
END;
END;
{ --------------- }
{ Eigener Thread, vereinfacht dargestellt }
Begin
   REPEAT
     while puffer_voll do
          application.processmessages;
     IF Puffer_leer THEN
       postmessage(Form_handle, WM_USER + 100); }
     Fuelle_puffer;
   UNTIL Abbruch;
end;
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Mo 27.05.13 22:38 
Also wenn du richtige Threads verwendest, kannst du auch SendMessage hernehmen. das kehrt ja erst zurück, nachdem die Nachricht verarbeitet wurde.

In einem separaten Thread Application.ProccessMessages aufzurufen geht übrigens gar nicht. Niemals. :!:

Für diesen Beitrag haben gedankt: GuaAck
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 28.05.13 15:18 
Das ganze hört sich nach einem guten Anwendungsgebiet für Pipes an. Da kannst du an der einen Seite (dem Thread) Daten reinschieben und an der anderen Seite (der Zeichenroutine) die Daten herausziehen.
Das ist speziell deshalb interessant, weil dadurch die Threadsynchronisierung des Puffers weg fällt.
msdn.microsoft.com/e...365590(v=vs.85).aspx

Für diesen Beitrag haben gedankt: GuaAck
GuaAck Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 376
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: Di 28.05.13 22:05 
Danke jfheins und jaenicke,

beides gute Tipps, Application.processmessages nicht im sep. Thread und Pipes.

Pipes habe ich noch nie benutzt, aber jetzt, nach ersten Versuchen könnte sie bei mir in anderen Anwendungen die Sache zu erleichtern.

Sendmessage bei Puffer_voll scheint eine gute Idee, das probiere ich aus.

Danke also für die Anregungen,
Gruß
GuaAck