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 2 von 2     12   
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#11

Re: Einfacher thread der nur ein MessageDlg anzeigt erzeugen

  Alt 4. Jan 2009, 17:13
Erstmal ist MessageBox im Gegensatz zu ShowMessage eine Funktion und keine Prozedur.
Das MessageBox in TApplication ist nur ein Wrapper für die WinAPI Funktion MessageBox.

Das bei MessageBox gewartet wird, bis der Benutzer eine Eingabe macht, resultiert wohl daraus, das erst nach dem Klicken auf eine der Schaltflächen (bei dir mbOK - was auch Standard ist und somit gar nicht übergeben werden müsste) die Funktion zum Programm zurückkehrt. Im Gegensatz dazu ist ShowMessage ein einfaches Anzeigefenster.
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#12

Re: Einfacher thread der nur ein MessageDlg anzeigt erzeugen

  Alt 4. Jan 2009, 17:14
Zitat von Kostas:
Delphi-Quellcode:
      ThreadMB := TMessageBoxThread.Create(true);
      ThreadMB.Priority := tpLower;
      ThreadMB.Resume;

      ThreadMB := TMessageBoxThread.Create(true);
      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
  {Windows.}MessageBox(nil, 'Hallo Welt', 'Schöner Text', MB_OK);
end;

end.
Mit MSDN-Library durchsuchenMessageBox brauchst du das nicht mehr synchronisieren, da es ja Threadsafe ist

Aber wirklich die Windows-API-Funktion verwenden und nicht die VCL-Version Application.Messagebox()

Du brauchst übrigens keine Variable im Konstruktor des Threads, du kannst einfach true reinschreiben
  Mit Zitat antworten Zitat
Kostas

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

Re: Einfacher thread der nur ein MessageDlg anzeigt erzeugen

  Alt 4. Jan 2009, 17:49
Zitat von jfheins:
...
Du brauchst übrigens keine Variable im Konstruktor des Threads, du kannst einfach true reinschreiben
Hallo Julius,

was könntest Du damit meinen?
Dem Constructor übergebe ich nur den Text welcher angezeit werden soll.
Aber vermutlich meinst Du etwas anderes.

Gruß Kostas
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#14

Re: Einfacher thread der nur ein MessageDlg anzeigt erzeugen

  Alt 4. Jan 2009, 18:03
      ThreadMB := TMessageBoxThread.Create(true); Das da meine ich - ist aber nicht so wichtig
  Mit Zitat antworten Zitat
Kostas

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

Re: Einfacher thread der nur ein MessageDlg anzeigt erzeugen

  Alt 4. Jan 2009, 18:17
Zitat von jfheins:
      ThreadMB := TMessageBoxThread.Create(true); Das da meine ich - ist aber nicht so wichtig
Ah, ich verstehe. Das war eigentlich Absicht um den Text der angezeigt werden soll
zu übergeben. Du meinst, es währe besser eine public property zu erzeugen und nach dem Create
über das property den Text zuweisen?

[edit]

ach jetzt sehe ich das gerade.
Ich mache das eigentlich so:

Delphi-Quellcode:
ThreadMB := TMessageBoxThread.Create(s);
      ThreadMB.Priority := tpLower;
      ThreadMB.Resume;

      ThreadMB := TMessageBoxThread.Create(s);
      ThreadMB.Priority := tpLower;
      ThreadMB.Resume;
und nicht so:
Wie das Create umgestellt wurde ist mir ein Rätsel.
Delphi-Quellcode:
ThreadMB := TMessageBoxThread.Create(true);
      ThreadMB.Priority := tpLower;
      ThreadMB.Resume;

      ThreadMB := TMessageBoxThread.Create(true);
      ThreadMB.Priority := tpLower;
      ThreadMB.Resume;
Gruß Kostas
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#16

Re: Einfacher thread der nur ein MessageDlg anzeigt erzeugen

  Alt 4. Jan 2009, 23:03
Ok, hab mich vertan

Ich hatte nicht gesehen, dass du den Konstruktor überschrieben hast ...

Aber wenn ich mich recht errinere, ist der Orginal-Parameter CreateSuspended - d.h. insb. dass du den Thread sofort nach dem Kontruktor startest weil du ja false übergibst - danach darfst du eigenlich keine Propertys mehr ändern, weil der Thread schon beendet sein könnte !

Da du ja sowiso am Ende ein Resume machst, kannst du also auch true übergeben.

Generell solltest du dich für einen Weg entscheiden: Alles im Konstruktor mitgeben und sofort loslegen oder den Thread schlafend erstellen und dann Properties belegen
  Mit Zitat antworten Zitat
Kostas

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

Re: Einfacher thread der nur ein MessageDlg anzeigt erzeugen

  Alt 4. Jan 2009, 23:14
Zitat von jfheins:
Ok, hab mich vertan

..
Generell solltest du dich für einen Weg entscheiden: Alles im Konstruktor mitgeben und sofort loslegen oder den Thread schlafend erstellen und dann Properties belegen
Wie müsste ich bitte den Tread umbauen so das er sofort nach dem erzeugen startet?
Ich würde gerne dem Constructor den Text übergeben und danach kann er auch sofort losgehen.

Und noch eine Kleinigkeit wenn ich darf: Den Buffer habe ich großzügig mit 500 byte angelegt.
Eigentlich würde ich gerne der Buffer zur Laufzeit ermitteln und setzen.
So geht es leider nicht, hast Du eine Idee?

Buffer: array of char;
SetLength(Buffer, Length(s));




Delphi-Quellcode:
procedure TMessageBoxThread.Execute;
const MAX_BUFFER = 500;
var Buffer: array [0..MAX_BUFFER] of char;
begin
  StrLCopy(Buffer, PChar(text), MAX_BUFFER);
  windows.MessageBox(handle, Buffer, 'Fingerabdruck gefunden', MB_OK);
end;
Gruß Kostas
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#18

Re: Einfacher thread der nur ein MessageDlg anzeigt erzeugen

  Alt 4. Jan 2009, 23:33
Das tut er doch bereits
Delphi-Quellcode:
constructor TMessageBoxThread.Create(msg:String);
begin
  inherited Create(false);
  text := msg;
  Priority := tpLower;
end;
Nur darfst du dann keine Properties mehr setzten nachdem du den kOnstruktor aufgerufen hast ...

Zu dem Char-Array-Pronblem: Schonmal versucht, den String einfach nach PChar zu casten?
  Mit Zitat antworten Zitat
Kostas

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

Re: Einfacher thread der nur ein MessageDlg anzeigt erzeugen

  Alt 4. Jan 2009, 23:50
Zitat von jfheins:
Das tut er doch bereits
Delphi-Quellcode:
constructor TMessageBoxThread.Create(msg:String);
begin
  inherited Create(false);
  text := msg;
  Priority := tpLower;
end;
Nur darfst du dann keine Properties mehr setzten nachdem du den kOnstruktor aufgerufen hast ...

Zu dem Char-Array-Pronblem: Schonmal versucht, den String einfach nach PChar zu casten?
oh je, natürlich funkt es, ich dachte ich muss Resume immer aufrufen.
Das mit PChar war das erste was ich probiert hatte. Zu dem Zeitpunkt hat es jedoch
Fehlermeldungen geregnet, allerding nicht wegen cast auf PChar wie ich soeben gemerkt
habe. Auch das geht also. So gefehlt mir das.

Tausend Dank Julius Du warst mir eine große Hilfe.

Gruß Kostas

Delphi-Quellcode:
unit MessageBoxThread;

interface

uses
  Classes, Dialogs, Forms, Sysutils, Windows;

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;
  Priority := tpLower;
end;


procedure TMessageBoxThread.Execute;
begin
  windows.MessageBox(handle, Pchar(text), 'Fingerabdruck gefunden!', MB_OK);
end;


end.
Aus dem Aufruf ist jetzt nur noch das übrichgeblieben.
ThreadMB := TMessageBoxThread.Create(s);
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 05:38 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