![]() |
AW: Object mit SendMessage an MainThread senden
Zitat:
Muss nix synchronisiert werden. Postmessage geht übers Betriebssystem und kommt im Hauptthread der Anwendung wieder an und der Text kann dort in einem Label angezeigt werden. Man spart sich den Aufruf von synchronize, der WorkerThread wird demnach auch nicht für einen kurzen Moment angehalten. Bei hochperformanten Anwendungen sollte man dies so lösen. |
AW: Object mit SendMessage an MainThread senden
Zitat:
|
AW: Object mit SendMessage an MainThread senden
Und wozu das mit dem Rüberreichen über einen Pointer und woanders freigeben?
Geht das nicht noch etwas komplizierter? Warum kein ![]() Es liest sich sehr unausgegoren und fehleranfällig an. |
AW: Object mit SendMessage an MainThread senden
Queue ist komfortabler aber erst in neueren Delphiversion möglich. Im Prinzip arbeitet es genauso wie Postmessage.
Das Problem Objekte sicher von einem Thread an einen anderen weiter zu reichen, wird dadurch allein aber nicht gelöst. |
AW: Object mit SendMessage an MainThread senden
Zitat:
|
AW: Object mit SendMessage an MainThread senden
Captnemo hat am Anfang angegeben er verwendet D5 ;-)
|
AW: Object mit SendMessage an MainThread senden
Zitat:
Aber wie ich vorher shcon sagte: Wenn man die globale Variable referenziert (@) und darauf den Zeiger überbergibt, dann muß am Ziel auch dieser Zeiger erstmal dereferenziert (^) werden, und wenn man direkt den Objektzeiger übergibt, dann muß nur gecastet werden. Und da Pointer was Böses sind, sollte man Diese möglicht vermeiden und schon gibt es keine Probleme mehr. :mrgreen: |
AW: Object mit SendMessage an MainThread senden
Warum TLogMessage als Object?
Delphi-Quellcode:
Empfangen im Hauptthread:
type
PLogMessage = ^TLogMessageMSG; TLogMessageMSG = record sLogText : String[255]; bIsDebug : boolean; end; var LogMsg: PLogMessage; const PM_MsgFromThread = WM_USER +4; procedure TComThread.SendMsgToMain(LogText: string; Debug: Boolean); begin New(LogMsg); LogMsg^.sLogText:=LogText; LogMsg^.bIsDebug:=Debug; SendMessage(frm_Main.Handle, PM_MsgFromThread,0,LParam(LogMsg)); end;
Delphi-Quellcode:
Mavarik
procedure Tfrm_main.LogMsgFromThread(var msg: TMessage);
var P: PLogMessage; fdebug: Boolean; fLogText: string; begin try P := PLogMessage(MSG.LParam); fdebug:=P.bIsDebug; fLogText:=P.sLogText; finally Dispose(P); end; end; |
AW: Object mit SendMessage an MainThread senden
Ob Object oder Record-Pointer, ist fast egal. (der kleiner Overhead des Objects fällt hier praktisch garnicht auf)
Aber wenn schon globale Variable, warum dann einen Record-Pointer? Der Record direkt als Variable und keiner muß den mehr freigeben und auch vorher nicht erstellen. PS: Wenn es die globale Variable gibt, dann fällt eigentlich sofort auf, daß man sich hier den Parameter sparen kann, da man auch gleich auf die Variable zugreifen kann. :stupid: Und schon fällt noch besser auf, warum diese Variable besser vernichtet gehört. |
AW: Object mit SendMessage an MainThread senden
Eine Liste mit durch Critical Sections gesichertem Zugriff ist imho fast die einzige vernünftige Art Daten unter verschiedenen Threads auszutauschen. Dem Formular dann nur noch per PostMessage() parameterlos mitteilen, dass es da neues drin gibt, und dieses arbeitet immer schon Index 0 ab und löscht aus der Liste bis sie leer ist. FiFo-Style.
Am Rande: SendMessage() ist in Threads, wenn ich mich nicht grad irre, eigentlich sogar ein ziemliches NoGo, da alles was die Empfänger dann tun auf ein Mal im Thread-Kontext statt findet. Und das kann je nach dem auch schon mal so richtig böse knallen, da es OS Ressourcen gibt, die nur im erstellenden Kontext verwendet werden dürfen. Davon ab pausiert der Thread bis alle Handler von den Empfängern fertig sind, und das ist ja nun auch nicht ganz der Sinn von Parallelisierung. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:14 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