![]() |
Einfacher thread der nur ein MessageDlg anzeigt erzeugen
Hallo Zusammen,
zunächst einmal ein gutes Neues Jahr ans Forum. ich habe mich mit threads noch nicht beschäftigt. Könnt Ihr mir bitte helfen ein thread zu erzeugen der nicht anderes tut als ein MessageDlg zu erzeugen. Der Hintergrund ist, an der aufrufenden Stelle können mehrere MessageDlg erzegut werden und der code soll jedoch sofort weiterlaufen. Der Anwender soll in Ruhe alle MessageDlg lesen und bestätigen können. Im Forum gibt es eine Menge über threads. Wenn man damit nicht gearbeitet hat, weis man nichteinmal nach was man suchen muss. Gruß Kostas |
Re: Einfacher thread der nur ein MessageDlg anzeigt erzeugen
Ein MessageDlg in einem Thread wird nicht funktionieren da die VCL nicht Threadsave ist. Wenn dann müsstest du MessageBox oder eine andere Api-Funktion verwenden. An welcher Stelle genau kommst du nicht weiter und hast du dir schon entsprechende Threadtutorials angesehen? Auch bei Delphi müsste eines dabei sein (zwar kein Tutorial aber ein Beispiel).
|
Re: Einfacher thread der nur ein MessageDlg anzeigt erzeugen
Zitat:
Ich habe mir noch nichts angeschaut weil das ein sehr umfangreiches und kompliziertes Thema ist. Ich kenne leider auch nicht die Zusammenhänge wann etwas nicht Threadsave ist. Wann immer ich eine ähnliche funktionalität benötigt habe, habe ich einfach einen Timer verwendet der mit die enstprechende Funktion aufgerufen hat. Nach Threadtutorials werde ich sogleich mal suchen. Gruß Kostas |
Re: Einfacher thread der nur ein MessageDlg anzeigt erzeugen
Hallo SirThornberry,
Über die Delphi Vorlage habe ich mit ein Threadrumpf erzeugen lassen und ausgeführt. Es wird leider nichts angezeigt. Möglicherweise hat es was mit ShowMessage zu tun es kommt ja auch aus der VCL. Zumindest würde ich einen Fehler erwarten, es kommt jedoch nichts. Hast Du eine Idee?
Delphi-Quellcode:
Und so sieht der Aufruf des Threads aus:
unit MessageBoxThread;
interface uses Classes, Dialogs; type TMessageBoxThread = class(TThread) private { Private-Deklarationen } protected text: string; procedure Execute; override; public constructor Create(msg:string); end; implementation { TMessageBoxThread } constructor TMessageBoxThread.Create(msg:String); begin inherited Create(false); text := msg; ShowMessage(text); // es passiert nichts end; procedure TMessageBoxThread.Execute; begin { Thread-Code hier plazieren } ShowMessage(text); // es passiert nichts end; end.
Delphi-Quellcode:
var ThreadMB: TMessageBoxThread;
begin ... ThreadMB := TMessageBoxThread(s); ThreadMB.Priority := tpLower; ThreadMB.Resume; |
Re: Einfacher thread der nur ein MessageDlg anzeigt erzeugen
Zitat:
Zitat:
|
Re: Einfacher thread der nur ein MessageDlg anzeigt erzeugen
Man kann aus der Execute-Methode nichts direkt von der VCL aufrufen, und dazu gehört auch ShowMessage. Du must im Protected-Abschnitt eine eigene Procedure deklarieren, die wiederum ShowMessage aufruft:
Delphi-Quellcode:
In der Execute-Methode erscheint nur folgendes:
TMessageBoxThread = class(TThread)
private { Private-Deklarationen } protected text: string; procedure Execute; override; procedure StarteThread; virtual; abstract; public constructor Create(msg:string); end;
Delphi-Quellcode:
und in der StarteThread-Methode der eigentliche Aufruf von ShowMessage:
procedure TMessageBoxThread.Execute;
begin Synchronize(StarteThread); end;
Delphi-Quellcode:
Probiere das mal aus.
procedure TMessageBoxThread.StarteThread;
begin ShowMessage(text); end; |
Re: Einfacher thread der nur ein MessageDlg anzeigt erzeugen
Hallo Zusammen,
tausend Dank, genau so gehts. Einen schönen Abend noch. Gruß Kostas |
Re: Einfacher thread der nur ein MessageDlg anzeigt erzeugen
Bedenke aber, was dabei passiert. Es funktioniert zwar und ist für die VCL auch sinnvoll, jedoch wird der Befehl eben auch entsprechend im Hauptthread ausgeführt.
|
Re: Einfacher thread der nur ein MessageDlg anzeigt erzeugen
Nimm eine MessageBox, die ist threadsafe.
|
Re: Einfacher thread der nur ein MessageDlg anzeigt erzeugen
Zitat:
ich habe jetz eine entdeckung gemacht. Zum testen werden zwei threads hintereinander erzeugt und ausgeführt. Wenn ich Procedure StarteThread ShowMessage verwende, werde sofort zwei Fenster mit der Nachricht erzeugt. Verwende ich jedoch MessageBox, wird die erte Nachticht erzeugt und sobald ich sie bestätigt habe wird die zweite angezeigt. Ich habe das Fenster verschoben es ist also nicht direkt hinterhalb. Als ob der erste Thread warten würde bis der vorherige fertig ist. Kann man das irgendwie erkleren? Dass zweite was micht interessieren würde ist, ob es Möglich ist den PChar Buffer für die MesageBox mit dynamischer Länge anzulegen. Buffer: array [0..MAX_BUFFER] of char; so geht es nicht: Buffer: array of char; SetLength(Buffer,Length(MeinString));
Delphi-Quellcode:
ThreadMB := TMessageBoxThread.Create(s);
ThreadMB.Priority := tpLower; ThreadMB.Resume; ThreadMB := TMessageBoxThread.Create(s); ThreadMB.Priority := tpLower; ThreadMB.Resume;
Delphi-Quellcode:
Gruß Kostas
unit MessageBoxThread;
interface uses Classes, Dialogs, Forms, Sysutils, Windows; type TMessageBoxThread = class(TThread) private { Private-Deklarationen } protected text: string; procedure Execute; override; procedure StarteThread; virtual; //abstract; public constructor Create(msg:string); end; implementation { TMessageBoxThread } constructor TMessageBoxThread.Create(msg:String); begin inherited Create(false); text := msg; end; procedure TMessageBoxThread.Execute; begin Synchronize(StarteThread); end; procedure TMessageBoxThread.StarteThread; const MAX_BUFFER = 500; var Buffer: array [0..MAX_BUFFER] of char; begin ShowMessage(text); // StrLCopy(Buffer, PChar(text), MAX_BUFFER); // Application.MessageBox(Buffer, 'Fingerabdruck gefunden', MB_OK); end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:34 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-2025 by Thomas Breitkreuz