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 Nach MessageDlg Meldung "Programm funktioniert nicht mehr" (https://www.delphipraxis.net/150822-nach-messagedlg-meldung-programm-funktioniert-nicht-mehr.html)

s.h.a.r.k 28. Apr 2010 10:20


Nach MessageDlg Meldung "Programm funktioniert nicht me
 
Hallo zusammen,

ich habe gerade ein sehr seltsames Problem und weiß nicht genau wieso das überhaupt der Fall ist :gruebel: Ich habe einen Thread, der den kompletten Startup erledigt, sodass ein SplashScreen immer zugreifbar bleibt. Aus dem Thread mache ich einmal ein SendMessage an eine Instanz einer Klasse, in im MainThread erzeugt wurde und ein Handle bereit stellt. So sieht der Aufruf auf, d.h. dass der "Workerthread" ja wartet, bis eine Antwort kommt.

Delphi-Quellcode:
if (SendMessage(FApplicationController.Handle, WM_STARTUP_MESSAGE, Integer(smDatabaseSetup), Integer(True)) <> 0) then
  raise EGeneralException.Create('Datenkbank-Setup wurde abgebrochen.', Self)
In der gerufenen Instanz erzeuge ich dann eine GUI, lasse darin einige Dinge erledigen und will danach ein MessageDlg anzeigen lassen, dass alles geklappt hat. Dabei nutze ich keinerlei Threads. Hier die Kurzfassung des Codes:

Delphi-Quellcode:
DBSetupController.DeleteAll();
DBSetupController.CreateAll();
DBSetupController.Import();

// Meldung, dass alles erfolgreich abgelaufen ist
MessageDlg('Datenbank-Setup wurde erfolgreich ausgeführt.', mtInformation, [mbOk], 0);
Es läuft alles perfekt, bis hin zum MessageDlg. Dort hängt sich scheinbar das Programm auf und Windows meldet freudig Programm X funktioniert nicht mehr (Hier noch ein Beispielbild, wie das ganze aussieht). Lasse ich den MessageDlg heraus, so funktioniert alles :wall:

Habe ich irgendwas falsch gemacht? Wird die GUI evtl. im Kontaxt des Workerthreads aufgerufen? (was ich aber nicht glaube) Oder woran kann es liegen?

// Edit

Gibt es evtl. irgendwelche Timeouts die es zu beachten gilt?

// Edit 2

Selbst wenn ich den Call mit Synchronize aufrufe klappt es nicht und das Programm schmiert ab:

Delphi-Quellcode:
procedure CallDBSetup();
begin
  if (SendMessage(FApplicationController.Handle, WM_STARTUP_MESSAGE, Integer(smDatabaseSetup), Integer(True)) <> 0) then
    raise EGeneralException.Create('Datenkbank-Setup wurde abgebrochen.', Self)
end;

{ ... }

Synchronize(CallDBSetup);
// Edit 3

Das Ganze passiert aber auch nur, wenn ich die Anwendung aus der IDE heraus starte. "Standalone" klappt alles wunderbar :wall:

sirius 5. Mai 2010 15:09

Re: Nach MessageDlg Meldung "Programm funktioniert nich
 
Versuche mal Messagebox zu verwenden.

himitsu 5. Mai 2010 15:14

Re: Nach MessageDlg Meldung "Programm funktioniert nich
 
Ich hab es nie ausprobiert, aber es könnte sein, daß bei SendMessage wirklich sowas passiert, allerdingt, selbst wenn es im WorkerThread ausgeführt wird, so würde zumindestens solange der Hauptthread angehalten.

Probier einfach mal PostMessage, wenn da der Fehler auch auftritt, dann liegt es nicht an der Message.

s.h.a.r.k 5. Mai 2010 19:17

Re: Nach MessageDlg Meldung "Programm funktioniert nich
 
Zitat:

Zitat von sirius
Versuche mal Messagebox zu verwenden.

Wo liegt denn der Unterschied zwischen MessageDlg und MessageBox?

daywalker9 5. Mai 2010 19:20

Re: Nach MessageDlg Meldung "Programm funktioniert nich
 
MessageBox ist ein API Aufruf von Windows - MessageDlg hingegen wird von Delphi selber aufgebaut (Form, Buttons etc...)

Luckie 7. Mai 2010 18:05

Re: Nach MessageDlg Meldung "Programm funktioniert nich
 
Der MessageDLG ist aus der VCL und diese ist nicht threadsafe. Deswegen nimm eine MessageBox.

s.h.a.r.k 8. Mai 2010 13:14

Re: Nach MessageDlg Meldung "Programm funktioniert nich
 
Das Wort threadsafe wollte ich hört :zwinker: habe es in der Hilfe zu MessageBox nicht gefunden gehabt.

himitsu 8. Mai 2010 13:26

Re: Nach MessageDlg Meldung "Programm funktioniert nich
 
Zitat:

Zitat von s.h.a.r.k
habe es in der Hilfe zu MessageBox nicht gefunden gehabt.

Strg+Mausklick auf MessageBox und dann immer weiter ... da merkt man schnell, was sich darin so alles versteckt.
In der OH steht halt nicht Alles und vorallem nichts über die Innereien.

s.h.a.r.k 10. Jun 2010 00:20

AW: Nach MessageDlg Meldung "Programm funktioniert nicht mehr"
 
Wollte hiermit nur noch bestätigen, dass MessageBox einwandfrei geklappt hat.


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