Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Thread und Events (https://www.delphipraxis.net/55988-thread-und-events.html)

mumu 30. Okt 2005 00:00


Thread und Events
 
ich habe einen Thread (nonVCL), da erzeuge ich ein objekt und weise den events die proceduren aus dem formular zu, das ich mit hilfe des Parameters übergeben habe.

Delphi-Quellcode:
function ThreadFunction(Parameter : Pointer) : Integer;
var funktion123: Tfunktion123;
    Form1      : TForm;
begin
  Form1 := Parameter.Form;

  _funktion123 := Tfunktion123.Create(nil);
  _function123.OnEreignis1 := Form1.Ereignis1;
  _function123.OnEreignis2 := Form1.Ereignis2;
  _function123.OnEreignis3 := Form1.Ereignis3;

  _function123.Start;
end;
funktioniert alles soweit gut. nur wenn ich dann auf den Canvas vom Label zugreif bekomm ich die Fehlermeldung: Leinwand/Bild erlaubt kein Zeichnen

Delphi-Quellcode:
procedure TForm.Ereignis1(Sender: TObjekt; Item: String);
begin
  Label1.Caption := MinimizeName(Item, Label1.Canvas, 300);
end;
denk mal, es liegt daran, dass ich den zugriff nicht synchronisiert hab.
wie kann ich das verhindern bzw. wie muss ich das ganze aufbauen, damit sowas nicht auftreten kann?

vielen dank schonmal

alzaimar 30. Okt 2005 07:52

Re: Thread und Events
 
Soweit ich das verstanden habe, musst Du synchronisieren. Ich schreibe mir innerhalb des Threads meine zu sonchronisierenden Routinen so:
Delphi-Quellcode:
Procedure TMyThread.SomeRoutineToSynchronize (aFoo, aBar : String);
Begin
  fFoo := aFoo; // privates Feld des Threads, leider geht die
  fBar := aBar; // Parameterübergabe an die zu synchronisierende Routine nur so.
  Synchronize (DoSomeRoutineToSynchronize);
End;


Procedure TMyThread.DoSomeRoutineToSynchronize;
Begin
  Form1.Label1.caption := fFoo + fBar;
End;

mumu 30. Okt 2005 08:06

Re: Thread und Events
 
hmm das problem ist aber nur, dass Synchronize nur beim VCL Thread Objekt verfügbar ist und das ich das problem hab, das mir z.b. CriticalSections nichts bringen, da ja das Objekt _function123 Events feuert und dadurch ne routine im Form1 aufruft.

jbg 30. Okt 2005 09:30

Re: Thread und Events
 
Dann musst du eben all das nachprogrammieren, was Borland in TThread.Synchronize eingebaut hat.

x000x 30. Okt 2005 11:34

Re: Thread und Events
 
Moin moin,

du könntest in Form1 eine Botschaftsmethode implementieren.
Aus deinem Thread schickst du dann per SendMessage entsprechende Nachrichten an Form1.
z.B.
Delphi-Quellcode:
//..
const
   CHANGE_LABEL_CAPTION = WM_USER + 222;
//..
   private
      procedure ChangeLabelCaption(var Msg: TMessage); message CHANGE_LABEL_CAPTION;
//..
procedure TForm1.ChangeLabelCaption(var Msg: TMessage);
begin
   With Msg do begin
      TLabel(FindComponent('Label' + IntToStr(WParam))).Caption := String(LParam);
   end;
end;
//..
{
Aus der ThreadFunction dann per
SendMessage((Form1.Handle, CHANGE_LABEL_CAPTION, 1, Integer(PChar('Neuer Text'))););
}
ist nicht die eleganteste Methode, sollte aber funktionieren...

mumu 2. Nov 2005 10:22

Re: Thread und Events
 
ja das mit den Messages hab ich mir auch schon gedacht. Nur leider weiß ich im Thread ja nicht, wann ein Ereignis durch das Objekt ausgelöst wird. dazu müsste ich OnEreignis1, OnEreignis2, usw... eine procedure zuweisen. das geht aber ja nicht, da mein thread sich ja nicht in ner klasse befindet.

wie kann ich das lösen?

igel457 2. Nov 2005 10:28

Re: Thread und Events
 
Bin mir nicht sicher ob das geht... :gruebel:
Probier einfach mal
Delphi-Quellcode:
label1.canvas.lock
.
. //Hier deine Zeichnung
.
label1.canvas.unlock
Ist nur so ne Idee...

mumu 3. Nov 2005 09:56

Re: Thread und Events
 
ja funktioniert.

mir würde aber trotzdem noch folgendes interessieren:

Zitat:

ja das mit den Messages hab ich mir auch schon gedacht. Nur leider weiß ich im Thread ja nicht, wann ein Ereignis durch das Objekt ausgelöst wird. dazu müsste ich OnEreignis1, OnEreignis2, usw... eine procedure zuweisen. das geht aber ja nicht, da mein thread sich ja nicht in ner klasse befindet.

x000x 4. Nov 2005 02:03

Re: Thread und Events
 
Moin moin,
Zitat:

Zitat von mumu
ja das mit den Messages hab ich mir auch schon gedacht. Nur leider weiß ich im Thread ja nicht, wann ein Ereignis durch das Objekt ausgelöst wird

ja, in deinem Fall müsstest du SendMessage in deiner Form1.Ereignis1 aufrufen.
Um bei dem Beispiel von oben zu bleiben:
Delphi-Quellcode:
procedure TForm1.Ereignis1(Sender: TObject; Item: String);
begin
   SendMessage(Form1.Handle, CHANGE_LABEL_CAPTION, 1, Integer(PChar(Item)));
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:09 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