AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Thread und Events

Ein Thema von mumu · begonnen am 30. Okt 2005 · letzter Beitrag vom 4. Nov 2005
Antwort Antwort
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#1

Thread und Events

  Alt 30. Okt 2005, 01:00
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
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: Thread und Events

  Alt 30. Okt 2005, 08:52
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;
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#3

Re: Thread und Events

  Alt 30. Okt 2005, 09:06
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.
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#4

Re: Thread und Events

  Alt 30. Okt 2005, 10:30
Dann musst du eben all das nachprogrammieren, was Borland in TThread.Synchronize eingebaut hat.
  Mit Zitat antworten Zitat
Benutzerbild von x000x
x000x

Registriert seit: 21. Jan 2004
Ort: Bei Hamburg
308 Beiträge
 
Delphi XE2 Professional
 
#5

Re: Thread und Events

  Alt 30. Okt 2005, 12:34
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...
Peter
-= Gruss Peter =-
-= alias x000x =-
  Mit Zitat antworten Zitat
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#6

Re: Thread und Events

  Alt 2. Nov 2005, 11:22
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?
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#7

Re: Thread und Events

  Alt 2. Nov 2005, 11:28
Bin mir nicht sicher ob das geht...
Probier einfach mal
Delphi-Quellcode:
label1.canvas.lock
.
. //Hier deine Zeichnung
.
label1.canvas.unlock
Ist nur so ne Idee...
Andreas
  Mit Zitat antworten Zitat
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#8

Re: Thread und Events

  Alt 3. Nov 2005, 10:56
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.
  Mit Zitat antworten Zitat
Benutzerbild von x000x
x000x

Registriert seit: 21. Jan 2004
Ort: Bei Hamburg
308 Beiträge
 
Delphi XE2 Professional
 
#9

Re: Thread und Events

  Alt 4. Nov 2005, 03:03
Moin moin,
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;
Peter
-= Gruss Peter =-
-= alias x000x =-
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:40 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