Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

1

20.11.2012, 21:15

[WINAPI] Catch mit MessageBox

Hi Leute,

ich habe eine C++ Win32 Anwendung, bei der ich in der main einen Globalen catch-Block für alle std::exceptions habe. Dafür wird dann einfach eine MessageBox ausgegeben. Es werden in dem Rahmen nur Exceptions geworfen, die von selbst implementierten Klassen erzeugt werden. Das ganze sind Test-Rahmenprogramme für meine Studenten, die kaum C++ können.

Wenn eine LPD3DXEFFECT-Klasse nicht geladen und kompiliert werden kann, weil ein Syntaxfehler ist, dann geht das mit Messageboxen einfach am besten. Leider werden bei mir nie die MessageBoxen angezeigt, das Fenster geht einfach wieder zu und die Anwendung wird beendet...


Nopase-Link

Ist nicht viel Code und schon etwas ausgedünnt. Habt ihr eine Idee?

Gruß Trommlbomml

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

20.11.2012, 21:21

Das ist sehr merkwürdig. Schau mal mit dem Debugger ob MessageBox() tatsächlich sofort returned...

Btw: Ich verwend für derlei Dinge immer OutputDebugString (landet bei Visual Studio dann im Output Window). Da ex.what() einen const char* liefert, solltest du wohl besser explizit die ANSI Varianten der Funktionen (MessageBoxA(), OutputDebugStringA()) verwenden.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

20.11.2012, 22:31

Das ist nicht merkwürdig, weil er als Owner-Handle NULL übergibt. Damit ist eine MessageBox immer non-blocking und das Programm endet korrekt.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

20.11.2012, 22:41

Das ist nicht merkwürdig, weil er als Owner-Handle NULL übergibt. Damit ist eine MessageBox immer non-blocking und das Programm endet korrekt.

Also das wäre mir sehr neu!? Die MSDN scheint dir jedenfalls zu widersprechen und in einem schnellen Experiment konnte ich ein solches Verhalten auch nicht beobachten...

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (20.11.2012, 22:51)


Helmut

5x Contest-Sieger

Beiträge: 692

Wohnort: Bielefeld

  • Private Nachricht senden

5

20.11.2012, 23:50

Sobald du einmal PostQuitMessage aufrufst returnen alle MessageBoxen im selben Thread sofort. Das was BlueCobold geschrieben hat ist Quatsch.
Sei stets geduldig gegenüber Leuten, die nicht mit dir übereinstimmen. Sie haben ein Recht auf ihren Standpunkt - trotz ihrer lächerlichen Meinung. (F. Hollaender)

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

6

21.11.2012, 06:58

Zitat von »BlueCobold«
Das ist nicht merkwürdig, weil er als Owner-Handle NULL übergibt. Damit ist eine MessageBox immer non-blocking und das Programm endet korrekt.

Also das wäre mir sehr neu!? Die MSDN scheint dir jedenfalls zu widersprechen und in einem schnellen Experiment konnte ich ein solches Verhalten auch nicht beobachten...
Genau dem ist mir auch so. Bei mir macht das setzen des Handles auch keinen unterschied.

Zitat

Das ist sehr merkwürdig. Schau mal mit dem Debugger ob MessageBox() tatsächlich sofort returned...
Jap genau das habe ich ja. Das ist irgendwie doof finde ich!

Zitat

Sobald du einmal PostQuitMessage aufrufst returnen alle MessageBoxen im selben Thread sofort. Das was BlueCobold geschrieben hat ist Quatsch.
Das ist ein guter Tipp, ich schau mal. vielleicht wird das Fenster bis dahin schon abgeräumt, weil ich es innerhalb des try-Blocks erst erzeuge?

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

7

21.11.2012, 07:06

Tatsächlich! Wenn ich das Fenster so erzeuge:

C-/C++-Quelltext

1
2
Window window(SCREENWIDTH, SCREENHEIGHT, "Lighting Sample");
try{    //....



An statt wie vorher so:


C-/C++-Quelltext

1
try{    Window window(SCREENWIDTH, SCREENHEIGHT, "Lighting Sample");    //....


dann bleibt die Messagebox erhalten. Danke an alle! :)

PS @dot: Mit OutputDebugString() ist mir neu, sehr hilfreich!

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

21.11.2012, 08:10

Also wenn ich ein Programm mit einem Thread habe, dann kann ich in diesem Thread ständig parent-lose Message-Boxen in einem Loop öffnen, ohne dass sie blockiert. Gebe ich einen parent an, blockieren sie.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

21.11.2012, 08:34

Redest du jetzt davon, die MessageBox() Funktion in einem separaten Thread aufzurufen?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

21.11.2012, 08:40

Ich rede davon in einem Thread einen Loop zu bauen, der MessageBox() aufruft. Soweit ich mich erinnere, war das in ein paar Programmen ein sehr hässliches Problem, eben weil es den Thread nicht blockiert hat, solange kein Owner-Handle übergeben wurde.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige