![]() |
begin thread und syncronize?
nabend zusammen,
ich habe eine ziemlich komplexen multithreadcode gebastetlt, der auch funktioniert. mein problem ist aber das er erst die stringgrid vcl aktualisiert wenn alle treads beendet sind. (geht ueber critikal sections) ich will aber das er waehrend die treads laufen, die vcl aktualisiert. nun gibt es ja dazu die methode synchronize(), die meines wissens aber nur mit dem vcl threadobject funktioniert. was mach ich aber wenn ich meinen thread direkt über begin thread starte? gruß richard |
Re: begin thread und syncronize?
Hi,
Also konkret fällt mir da jetzt auch nichts ein, aber ich würde mir den Quelltext der Synchronize() Methode anschauen und diese Funktion dann entsprechend nachbauen. mfG mirage228 |
Re: begin thread und syncronize?
Wenn du aus dem Thread mit SendMessage etwas an den hauptthread sendest wird auch eine Syncronisation durchgeführt weil ja die Message letztendlich über die Nachrichtenschleife des hauptthreads kommt und der Thread wartet auf das Result von dieser Message. In dem Fall sollten also Thread und Hauptthread syncron sein. Sende also aus deinem Thread eine Message mit SendMessage an ein Fenster aus dem Hauptthread (TForm1.handle etc.) und in der Methode welche die Message entgegennimmt kannst du dann auf dein StringGrid etc. zugreifen.
|
Re: begin thread und syncronize?
mhh mal gucken was lucky dazu meint
|
Re: begin thread und syncronize?
schneller bist du wenn du es einfach ausprobierst bzw. im MSDN nachließt. Da müsste auch stehen das Bei SendMessage gewartet wird bis das Result der Message zurück kommt.
|
Re: begin thread und syncronize?
Zitat:
|
Re: begin thread und syncronize?
und hier mal ein kleines Beispiel wo man genau sieht das der Thread wartet:
Delphi-Quellcode:
Bei diesem Beispiel wird beim Klick auf einen Button der Thread gestartet. In dem Thread wird dann ein SendMessage an den haupttread gemacht und erst nach diesem SendMessage gibt der Thread etwas aus. Man sieht bei dem Beispiel also das erst die Message "text aus haupttread" kommt und erst wenn man dort auf "ok" klickt und somit das Sendmessage zurück kehrt dann der text "text aus thread" kommt.
type
[...] procedure FMsgProc(var AMsg: TMessage); message wm_user + 1; [...] function GThreadFunc(p: Pointer): Integer; begin SendMessage(Cardinal(p), wm_User + 1, 0, 0); MessageBox(0, 'text aus thread', '', 0); end; procedure TForm1.FMsgProc(var AMsg: TMessage); begin MessageBox(0, 'text aus hauptthread', '', 0); end; procedure TForm1.Button1Click(Sender: TObject); var LID: Cardinal; begin BeginThread(nil, 0, @GThreadFunc, Pointer(Handle), 0, LID); end; |
Re: begin thread und syncronize?
ja aber ist das den ein sinnvoller weg das so zu machen oder ist es besser den code neu auf vcl threadobject umzuschreiben?
|
Re: begin thread und syncronize?
der Weg ist schon sinnvoll. Die Syncronize Methode macht ja auch nix anderes als dafür zu sorgen das der Thread nicht weiter läuft während im Hauptthread etwas abgearbeitet wird. Und mit dem SendMessage ereichtst du genau das, der Thread macht nix bevor du nicht aus diesem messagehandler zurück kehrst. Und da der Thread nix macht, also auf keine Variablen etc. zugreift kann auch nix schief gehen.
|
Re: begin thread und syncronize?
das heist also
1. thread erzeugen 2. message aus thread an hauptread senden 3. meinen code aufrufen stringgrid1.cell[x,y]:='blablabla'; 4. message aus hauptread an tread senden und im sagen mach weiter! hab ich das prinzip jetzt so richtig verstanden? |
Re: begin thread und syncronize?
Punkt 4 kannst du dir sparen.
|
Re: begin thread und syncronize?
ok danke leute werd es gleich ma versuchen ;)
vielen , vielen herzlichen dank Luckie und SirThornberry Gruß Richard |
Re: begin thread und syncronize?
so, ich hab das jetzt mal probiert, nur traegt er jetz nichts mehr ins stringgrid ein.
die routine wird aber definitiv ausgefuehrt, da er die messagebox anzeigt. ich denke es koennte daran liegen, das mehrere threads versuchen gleichzeitig auf verschiedene cellen des stringgrid zuzugreiffen. komisch is auch das die vcl kurzzeitig haengt, wenn die threads laenger arbeiten muessen. ich hab mal probiert waitformultibleobjects Infinite durch einen zahlenwert zu ersetzten. (100) -> vcl haengt nicht mehrm aber ins stringgrid wird trozdem nichts gezeichnet. gruß richard |
Re: begin thread und syncronize?
Ich habe das gerade mit einer DLL in C und einem Hauptprogramm in Delphi implementiert und es funktioniert problemlos.
LParam nutze ich als einen Zeiger auf eine Struktur. Das geht deshalb gut, da die DLL ja im gleichen Adressraum wie das Programm steht und daher der Zeiger gueltig ist. SendMessage garantiert das der Thread nicht weiterlaeuft und die Struktur veraendert. Jetzt muss ich nur noch rauskriegen wie ich Threadsynchronisation unter Linux mache, ohne das mein API leidet.
Delphi-Quellcode:
Sorry, das Programm ist etwas ausgeschlachtet, da das zugehoerige Produkt noch nicht fertig ist.
unit BlaMain;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, BlaKit; type TBlaMainForm = class(TForm) // deleted procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); public BlaDev: Pointer; CallbackMsg: ULONG; function CallbackEvent(var Msg: TMessage): Boolean; end; var BlaMainForm: TBlaMainForm; implementation {$R *.dfm} function TBlaMainForm.CallbackEvent(var Msg: TMessage): Boolean; var I: Integer; BlaData: PBLA_DATA; begin // check for message from DLL Result := Msg.Msg = CallbackMsg; if Result then begin // LParam of message contains pointer to BLA_DATA structure BlaData := PBLA_DATA(Msg.LParam); // deleted end; end; procedure TBlaMainForm.FormCreate(Sender: TObject); begin // deleted // hook the message received Application.HookMainWindow(CallbackEvent); // tell the DLL to send messages when data is received // returns the message ID used with SendMessage CallbackMsg := BlaRegister(BlaDev, Application.Handle); end; procedure TblaMainForm.FormDestroy(Sender: TObject); begin Application.UnhookMainWindow(CallbackEvent); // deleted end; end. |
Re: begin thread und syncronize?
Nur zur Anmerkung, die Synchronize-Methode aus dem TThread-Objekt macht auch nichts anderes ;)
|
Re: begin thread und syncronize?
ich hab es ja jetz ueber message gemacht, und er synchronisiert jetz auch, traegt aber nix ins stringgrid ein. folglich muss das problem wo anders zu suchen sein ich vermute mal bei waitformultibleobjects
weis nicht ob das richtig ist wenn mehrere treads parallel auf ein vcl object zugreifen richard |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:29 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