AGB  ·  Datenschutz  ·  Impressum  







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

MessageDlg in Thread aufrufen?

Ein Thema von StTüff · begonnen am 31. Aug 2005 · letzter Beitrag vom 31. Aug 2005
Antwort Antwort
StTüff

Registriert seit: 3. Dez 2002
132 Beiträge
 
Delphi 2006 Enterprise
 
#1

MessageDlg in Thread aufrufen?

  Alt 31. Aug 2005, 13:37
Hallo!

Ich habe ein Problem mit "MessageDlg". Ich führe in einem Thread eine Funktion aus. Geht was schief, wird direkt in der Funktion eine Meldung mit "MessageDlg" ausgegeben. Leider ist es jetzt so, dass die Meldung nicht korrekt angezeigt wird (falsche Größe, Button fehlt usw.). Zusätzlich treten Zugriffsverletzungen auf.
Rufe ich die Funktion direkt auf (nicht in einem separaten Thread), dann klappt alles.
Darf ich "MessageDlg" nicht aus einem Thread aufrufen

Ich hoffe, dass mir jemand einen Hinweis geben kann....

Gruß,

StTüff

Anbei ein Bild, wie die Meldung aussieht.
Miniaturansicht angehängter Grafiken
meld_242.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

Re: MessageDlg in Thread aufrufen?

  Alt 31. Aug 2005, 13:55
Alles was mit der GUI zu tun hat muss innerhalb von Threads über Synchronize aufgerufen werden. Du schreibst dir also am besten eine Routine, die den Fehler ausgibt, und übergibst diese an Synchronize.
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#3

Re: MessageDlg in Thread aufrufen?

  Alt 31. Aug 2005, 14:13
... und versuch nicht, der Prozedur Parameter mitzugeben, z.B. so:
Synchronize(MeineProzedur(IchBinEinParameter)) Das geht meines Wissens (und Erfahrung ) nach leider nicht. Diese Sachen müsstest du dir in dem Thread-Object merken und dann muss sich die Prozedur die benötigten Werte "rauslutschen"
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
StTüff

Registriert seit: 3. Dez 2002
132 Beiträge
 
Delphi 2006 Enterprise
 
#4

Re: MessageDlg in Thread aufrufen?

  Alt 31. Aug 2005, 14:36
OK! Vielen Dank. Das beantwortet meine Frage. Ich muss also unterscheiden, ob ich die Funktion aus eine Thread aufrufe, oder eben nicht. Am besten mache ich die Funktion zur Memberfunktion der Thread-Klasse (ist diese im Moment noch nicht).
Mir scheint, ich muss das ganze Konzept noch mal überdenken.

Gruß,

StTüff
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

Re: MessageDlg in Thread aufrufen?

  Alt 31. Aug 2005, 14:39
Synchronize selbst ist ja eine Methode von TThread (siehe Delphi-Referenz durchsuchenTThread.Synchronize) und erwartet als Parameter ebenfalls auch eine Methode.
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
StTüff

Registriert seit: 3. Dez 2002
132 Beiträge
 
Delphi 2006 Enterprise
 
#6

Re: MessageDlg in Thread aufrufen?

  Alt 31. Aug 2005, 15:06
Ich möchte meine Lösung kurz vorstellen:

Meine Klasse sieht jetzt so aus:
Delphi-Quellcode:
TTestThread = class(TThread)
  private
    { Private-Deklarationen }
  protected
    Msg: string;
    DlgType: TMsgDlgType;
    Buttons: TMsgDlgButtons;
    HelpCtx: Longint;
    DlgResult: Integer;
    procedure ThreadDlg();
    procedure Execute; override;
  public
    function ThreadDlgExecute(const InMsg: string; InDlgType: TMsgDlgType;
      InButtons: TMsgDlgButtons; InHelpCtx: Longint):integer;
  end;
Die Funktionen:
Delphi-Quellcode:
procedure TTestThread.ThreadDlg();
begin
  DlgResult:=MessageDlg(Msg, DlgType, Buttons, HelpCtx);
end;
function TTestThread.ThreadDlgExecute(const InMsg: string; InDlgType: TMsgDlgType;
      InButtons: TMsgDlgButtons; InHelpCtx: Longint):integer;
begin
  Msg:=InMsg;
  DlgType:=InDlgType;
  Buttons:=InButtons;
  HelpCtx:=InHelpCtx;
  Synchronize(ThreadDlg);
  result:=DlgResult;
end;
Das schöne daran ist, dass ich nur den Funktionsaufruf geringfügig ändern muss:
MessageDlg('Fehlfunktion!',mtError ,[mbOK],0); in
form1.Thread.ThreadDlgExecute('Fehlfunktion!',mtError ,[mbOK],0); und ich kann die Funktion auch von außerhalb des Threads aufrufen und es geht trotzdem.

Was meint Ihr Kann man das so machen, oder ist das "unsauber"

Gruß und besten Dank schon mal für die konstruktive Kritik....

StTüff
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

Re: MessageDlg in Thread aufrufen?

  Alt 31. Aug 2005, 15:25
Zitat von StTüff:
und ich kann die Funktion auch von außerhalb des Threads aufrufen und es geht trotzdem.
Was meint Ihr Kann man das so machen, oder ist das "unsauber"
Sieht erst mal gut aus.
Außerhalb des Threads solltest du sie nicht aufrufen
Zitat von Delphi Online-Hilfe:
Warnung: Rufen Sie Synchronize nicht aus dem Haupt-Thread aus auf. Dies kann zu einer unendlichen Schleife führen.
Damit ist allerdings wirklich außerhalb des Threads gemeint, also des Ausführungsfadens. Das muss nicht unbedingt eine Methode deiner TThread-Klasse sein!
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
StTüff

Registriert seit: 3. Dez 2002
132 Beiträge
 
Delphi 2006 Enterprise
 
#8

Re: MessageDlg in Thread aufrufen?

  Alt 31. Aug 2005, 15:31
Danke!
  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 09:42 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