Einzelnen Beitrag anzeigen

Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#1

Nach MessageDlg Meldung "Programm funktioniert nicht me

  Alt 28. Apr 2010, 10:20
Hallo zusammen,

ich habe gerade ein sehr seltsames Problem und weiß nicht genau wieso das überhaupt der Fall ist 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

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
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat