Entwickler-Ecke
Windows API - Thread-Wechsel erzwingen
GuaAck - Mo 27.05.13 22:27
Titel: Thread-Wechsel erzwingen
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
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;
Begin REPEAT while puffer_voll do application.processmessages; IF Puffer_leer THEN postmessage(Form_handle, WM_USER + 1, 0, 0); } Fuelle_puffer; UNTIL Abbruch; end; |
jfheins - 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. :!:
jaenicke - 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.
http://msdn.microsoft.com/en-us/library/windows/desktop/aa365590(v=vs.85).aspx
GuaAck - 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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!