Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Record von Thread an MainApplication? (https://www.delphipraxis.net/94736-record-von-thread-mainapplication.html)

creality 26. Jun 2007 10:13


Record von Thread an MainApplication?
 
Hallo Forum,

zur Zeit nehme ich diese Methode um Messages aus Threads heraus (OHNE SYNCHRONIZE!!!) an meine MainApp zu verschicken:

AUSSM THREAD:
Delphi-Quellcode:
{Message to Main --------------------------------------------------------------}

procedure PreProcessing_RED.PostToRedConsole(msg: shortstring);
var
  msgstrptr: PShortstring;
begin
  new(msgstrptr);
  msgstrptr^ := msg;
  postmessage(EyePiU_main.handle, RedMsg, integer(msgstrptr), 0);
end;
IN DER MAINAPP

Delphi-Quellcode:
{MessageFromChannelRed --------------------------------------------------------}

procedure TEyePiU_main.OnREDChannelMessage(var MR: TMessage);
var
  msgstrptr: PShortstring;
begin
  msgstrptr := ptr(MR.wparam);
  memo_RED.lines.Insert(0, msgstrptr^);
  dispose(msgstrptr);
end;
So klappts ohne Performanceeinbrüche.

Meine Frage nun...wie kann man ein Record oder ein Array statt einer Message übergeben? Und wie kommt man dann in der MainApp auf die einzelnen Record oder Array Elemente?

ste_ett 26. Jun 2007 10:21

Re: Record von Thread an MainApplication?
 
Du könntest einen Pointer auf einen Array/Record/etc über den LParam-Parameter übergeben.
Vorraussetzung ist dann allerdings, dass dieser in der Zwischenzeit nicht verändert wird.

creality 26. Jun 2007 10:31

Re: Record von Thread an MainApplication?
 
hmm...der Thread füllt das Array mit Daten während der Laufzeit. Am Ende soll er das Array übergeben. Im Prinzip dürfte der Pointer nicht verändert werden. Allerdings gibts noch 5 weitere Threads die ebenfalls mitarbeiten. Bin mir nicht sicher ob nicht doch was verändert wird.

creality 26. Jun 2007 10:35

Re: Record von Thread an MainApplication?
 
Achso...

Was passiert wenn der Pointer übergeben wurde und der Thread wird Terminiert. Dann müssten doch alle Resourcen freigegeben werden also auch das Array auf das der Pointer zeigt. Oder?

Robert Marquardt 26. Jun 2007 10:42

Re: Record von Thread an MainApplication?
 
postmessage(EyePiU_main.handle, RedMsg, 0, LPARAM(msgstrptr));
ist besser. Immer die korrekte Umtypung benutzen und der wParam ist (theoretisch) nicht geeignet einen Pointer aufzunehmen.

Was du machst ist einen eigenen Speicherblock zu alloziieren und die zu uebergebenden Daten dort hineinzutun. PostMessage fuehrt eine Synchronisation aus. Es ist alles in Ordnung. Willst du ein Record uebergeben, dann einfach statt ShortString den Record-Typ verwenden.

creality 26. Jun 2007 10:44

Re: Record von Thread an MainApplication?
 
Danke!

Ich werds mal ausbessern und probieren :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz