![]() |
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:
funktioniert alles soweit gut. nur wenn ich dann auf den Canvas vom Label zugreif bekomm ich die Fehlermeldung: Leinwand/Bild erlaubt kein Zeichnen
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;
Delphi-Quellcode:
denk mal, es liegt daran, dass ich den zugriff nicht synchronisiert hab.
procedure TForm.Ereignis1(Sender: TObjekt; Item: String);
begin Label1.Caption := MinimizeName(Item, Label1.Canvas, 300); end; wie kann ich das verhindern bzw. wie muss ich das ganze aufbauen, damit sowas nicht auftreten kann? vielen dank schonmal |
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; |
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.
|
Re: Thread und Events
Dann musst du eben all das nachprogrammieren, was Borland in TThread.Synchronize eingebaut hat.
|
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:
ist nicht die eleganteste Methode, sollte aber funktionieren...
//..
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')));); } |
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? |
Re: Thread und Events
Bin mir nicht sicher ob das geht... :gruebel:
Probier einfach mal
Delphi-Quellcode:
Ist nur so ne Idee...
label1.canvas.lock
. . //Hier deine Zeichnung . label1.canvas.unlock |
Re: Thread und Events
ja funktioniert.
mir würde aber trotzdem noch folgendes interessieren: Zitat:
|
Re: Thread und Events
Moin moin,
Zitat:
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 10:30 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 by Thomas Breitkreuz