AGB  ·  Datenschutz  ·  Impressum  







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

Probleme mit PostMessage aus einem Thread

Ein Thema von deadcantdance · begonnen am 6. Feb 2009 · letzter Beitrag vom 7. Feb 2009
Antwort Antwort
Seite 1 von 2  1 2      
deadcantdance

Registriert seit: 25. Feb 2008
81 Beiträge
 
Delphi 2007 Professional
 
#1

Probleme mit PostMessage aus einem Thread

  Alt 6. Feb 2009, 16:28
Hi,

sporadisch habe ich das Problem, dass mein Zeichnen der Controls auf meinem Formular Exceptions auftreten. Nach einiger Suche bin ich auf die vermutlichen Ursache gestoßen:

Ich habe ein Control, abgeleitet vom VirtualStringTree. Dieses Control besitzt eine Methode, die aus einem anderen Thread aufgerufen wird, um dem Control mitzuteilen, dass es sich aktualisieren soll. Um nicht direkt aus dem anderen Thread zu zeichnen, gehe ich wie folgt vor:

Delphi-Quellcode:
procedure MyControl.DoCallback;
begin
  PostMessage(Self.Handle, WM_MYCONTROLRELOAD, 0, 0);
end;
Außerdem gibt es noch eine Methode, die auf diese Nachricht reagiert:
Delphi-Quellcode:
procedure DoControlReload( var Message: TMessage); message WM_MYCONTROLRELOAD;

procedure MyControl.DoControlReload( var Message: TMessage);
begin
  ReloadfromDB;
  Invalidate;
end;
Das Problem ist nun, dass die Zeichenroutine des Controls aus dem Thread aufgerufen wird, der auch die Callback aufgerufen hat. Bisher war ich davon ausgegangen, dass wenn ich eine Nachricht mit PostMessage an mein Control schicke, diese auch im Hauptthread abgearbeitet wird. Das ist anscheinend nicht der Fall?!

Zusätzlich möchte ich noch erwähnen, dass der Thread im Execute eine while-Schleife beinhaltet, in der auch Application.ProcessMessages aufgerufen wird.

Meine Frage an Euch: Wie kann ich nun verhindern, dass die Zeichenroutine des Controls aus dem anderen Thread aufgerufen wird?

Viele Grüße,
deadcantdance
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Probleme mit PostMessage aus einem Thread

  Alt 6. Feb 2009, 16:33
Nimm das Application.ProcessMessages aus dem Thread raus
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
deadcantdance

Registriert seit: 25. Feb 2008
81 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Probleme mit PostMessage aus einem Thread

  Alt 6. Feb 2009, 16:44
Das kann ich nicht, der Thread läuft mit höherer Priorität, da es sich um den Kommunikationsthread handelt. Nehme ich die Anweisung raus, friert mir die GUI ein.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Probleme mit PostMessage aus einem Thread

  Alt 6. Feb 2009, 17:06
Bau ein sleep(0) ein!
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
deadcantdance

Registriert seit: 25. Feb 2008
81 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Probleme mit PostMessage aus einem Thread

  Alt 6. Feb 2009, 17:11
Hilft leider auch nicht, sobald ich in der GUI auf einen Button klicke, friert diese ein!
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Probleme mit PostMessage aus einem Thread

  Alt 6. Feb 2009, 17:13
Und "SwitchToThread;"?

Edit: Du solltest wahrscheinlich eher die Priorität etwas zurückschrauben.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
deadcantdance

Registriert seit: 25. Feb 2008
81 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Probleme mit PostMessage aus einem Thread

  Alt 6. Feb 2009, 17:23
Ich muss mich korrigieren, die Priority steht auf Normal.

SwitchToThread hilft leider auch nicht, CPU-Auslastung geht auf 100%
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Probleme mit PostMessage aus einem Thread

  Alt 6. Feb 2009, 17:37
Kein Ahnung, was du da machst.

Self.Handle ist auch noch ein Problem (aber ich vermute nicht das primäre). Besser ist du übergibst das Handle an das Threadobjekt und machst dort Postmessage.

Dann vielleicht mal sleep(x) (mit x>0). Damit hier mal etwas pausiert.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#9

Re: Probleme mit PostMessage aus einem Thread

  Alt 6. Feb 2009, 17:39
Application.ProcessMessages darf nicht im Kontext des Threads laufen; da beisst keine Maus einen Faden ab!
Dein Thread sollte auch nicht unbedingt mit höherer Prio laufen.
Wenn dein Thread auf die Benutzeroberfläche zugreifen muss, dann immer mit der Methode Synchronize:
Delphi-Quellcode:
procedure TMyThread.Execute;
begin

  for i := ... to ... do
  begin
    FStatus := 'Lese '+ IntToStr(i);
    Synchronize(UpdateLabel);

    DatenLesen;

    FStatus := 'Verarbeite '+ IntToStr(i);
    Synchronize(UpdateLabel);
    
    Datenverarbeiten;
   
    Synchronize(UpdateGui);

    if Terminated then Exit; // wichtig, um den Thread sauber abbrechen zu können
  end;
end;

procedure TMyThread.UpdateLabel;
begin
  form1.StatusLabel.Caption := FStatus;
  form1.StatusLabel.Refresh;
end;

procedure TMyThread.UpdateGui;
begin
  form1.vsg1.items.Add(....);
  form1.vsg1.refresh;
end;
Der Trick ist nun, dass Synchronize eine Windows Botschaft in die Messagequeue setzt
und die Methode UpdateGui im Kontext der Hauptthreads ausgeführt wird.

Über Synchronize kannst du nur eine Methode ohne Parameter aufrufen.
Diese Einschränkung lässt sich umgehen, indem die Parameter als Variablen im Thread-Objekt gespeichert werden.

Übrigens:
Wenn dein Thread niemals wartet (WaitforMultipleObjects), dann ist es ganz normal, dass die CPU-Auslastung auf 100% geht!
Andreas
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#10

Re: Probleme mit PostMessage aus einem Thread

  Alt 6. Feb 2009, 18:39
Zitat von shmia:
Application.ProcessMessages darf nicht im Kontext des Threads laufen; da beisst keine Maus einen Faden ab!
Auch wenn es leicht offtopic ist: warum ist das so und was passiert, wenn ich aus einem Thread eine Routine (ohne synchronize) aufrufe, in der das steht? Ich glaub' das habe ich schonmal irgendwo gemacht, ohne das es Probleme gab.
Ich dachte immer, Application.Processmessages erzwingt die Abarbeitung der Windows-Eventqueue. Das kann doch auch aus einem Thread sinnvoll sein, z.B. wenn es Zugriffe auf Datenbanken, Hardware-dlls etc. gibt.

Grüße, Messie
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 10:10 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