AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Einfacher thread der nur ein MessageDlg anzeigt erzeugen
Thema durchsuchen
Ansicht
Themen-Optionen

Einfacher thread der nur ein MessageDlg anzeigt erzeugen

Ein Thema von Kostas · begonnen am 3. Jan 2009 · letzter Beitrag vom 4. Jan 2009
Antwort Antwort
Seite 1 von 2  1 2      
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.058 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Einfacher thread der nur ein MessageDlg anzeigt erzeugen

  Alt 3. Jan 2009, 13:34
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
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Einfacher thread der nur ein MessageDlg anzeigt erzeugen

  Alt 3. Jan 2009, 13:42
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).
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.058 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

Re: Einfacher thread der nur ein MessageDlg anzeigt erzeugen

  Alt 3. Jan 2009, 16:12
Zitat von SirThornberry:
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).
Sehr interessant das die VCL nicht Threadsave ist!
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
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.058 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

Re: Einfacher thread der nur ein MessageDlg anzeigt erzeugen

  Alt 3. Jan 2009, 17:23
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:
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.
Und so sieht der Aufruf des Threads aus:

Delphi-Quellcode:
var ThreadMB: TMessageBoxThread;
begin
  ...
      ThreadMB := TMessageBoxThread(s);
      ThreadMB.Priority := tpLower;
      ThreadMB.Resume;
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#5

Re: Einfacher thread der nur ein MessageDlg anzeigt erzeugen

  Alt 3. Jan 2009, 17:33
Zitat:
ThreadMB := TMessageBoxThread(s)
Wo steht denn hier das "Create"

Zitat:
Delphi-Quellcode:
procedure TMessageBoxThread.Execute;
begin
  { Thread-Code hier plazieren }
  ShowMessage(text); // es passiert nichts
end;
Lese dir mal den Roman, den Delphi als Kommentar vor der Thread Klasse hingeschrieben hat, genau durch.
  Mit Zitat antworten Zitat
devidespe

Registriert seit: 7. Sep 2006
Ort: Berlin
434 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: Einfacher thread der nur ein MessageDlg anzeigt erzeugen

  Alt 3. Jan 2009, 17:58
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:
TMessageBoxThread = class(TThread)
  private
    { Private-Deklarationen } 
  protected
    text: string;
    procedure Execute; override;
    procedure StarteThread; virtual; abstract;
  public
    constructor Create(msg:string);
  end;
In der Execute-Methode erscheint nur folgendes:

Delphi-Quellcode:
procedure TMessageBoxThread.Execute;
begin
  Synchronize(StarteThread);
end;
und in der StarteThread-Methode der eigentliche Aufruf von ShowMessage:

Delphi-Quellcode:
procedure TMessageBoxThread.StarteThread;
begin
  ShowMessage(text);
end;
Probiere das mal aus.
Devid
57 65 72 20 6C 65 73 65 6E 20 6B 61 6E 6E 2C 20 69 73 74 20 6B 6C 61 72 20 69 6D 20 56 6F 72 74 65 69 6C 21
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.058 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

Re: Einfacher thread der nur ein MessageDlg anzeigt erzeugen

  Alt 3. Jan 2009, 22:01
Hallo Zusammen,

tausend Dank, genau so gehts.

Einen schönen Abend noch.

Gruß Kostas
  Mit Zitat antworten Zitat
Cyf

Registriert seit: 30. Mai 2008
407 Beiträge
 
Lazarus
 
#8

Re: Einfacher thread der nur ein MessageDlg anzeigt erzeugen

  Alt 4. Jan 2009, 04:28
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.
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#9

Re: Einfacher thread der nur ein MessageDlg anzeigt erzeugen

  Alt 4. Jan 2009, 10:25
Nimm eine MessageBox, die ist threadsafe.
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.058 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

Re: Einfacher thread der nur ein MessageDlg anzeigt erzeugen

  Alt 4. Jan 2009, 16:03
Zitat von Die Muhkuh:
Nimm eine MessageBox, die ist threadsafe.
Hallo,

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:
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.
Gruß Kostas
  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 00:55 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