Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi MessageDlg in Thread aufrufen? (https://www.delphipraxis.net/52608-messagedlg-thread-aufrufen.html)

StTüff 31. Aug 2005 13:37


MessageDlg in Thread aufrufen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
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. :wall:
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.

Flocke 31. Aug 2005 13:55

Re: MessageDlg in Thread aufrufen?
 
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.

chaosben 31. Aug 2005 14:13

Re: MessageDlg in Thread aufrufen?
 
... und versuch nicht, der Prozedur Parameter mitzugeben, z.B. so:
Delphi-Quellcode:
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"

StTüff 31. Aug 2005 14:36

Re: MessageDlg in Thread aufrufen?
 
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

Flocke 31. Aug 2005 14:39

Re: MessageDlg in Thread aufrufen?
 
Synchronize selbst ist ja eine Methode von TThread (siehe Delphi-Referenz durchsuchenTThread.Synchronize) und erwartet als Parameter ebenfalls auch eine Methode.

StTüff 31. Aug 2005 15:06

Re: MessageDlg in Thread aufrufen?
 
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:
Delphi-Quellcode:
MessageDlg('Fehlfunktion!',mtError ,[mbOK],0);
in
Delphi-Quellcode:
form1.Thread.ThreadDlgExecute('Fehlfunktion!',mtError ,[mbOK],0);
:thumb: und :thumb: 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

Flocke 31. Aug 2005 15:25

Re: MessageDlg in Thread aufrufen?
 
Zitat:

Zitat von StTüff
:thumb: und :thumb: 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:

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!

StTüff 31. Aug 2005 15:31

Re: MessageDlg in Thread aufrufen?
 
:P Danke! :P


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