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

Anonymous

unregistriert

1

05.06.2004, 22:53

Programmende

Hallo

Beim Programmende entdecke ich in verschiedenen Codes von Büchern unterschiedliche Versionen.

Ist das hier richtig? Muss man UnregisterClass aufrufen? (steht nicht in allen Codes). Beendet PostQuitMessage(0) die Hauptschleife und geht zum Ende oder ganz raus?

Nach der Hauptschleife:

Quellcode

1
2
3
    DX-Aufräum-Funktionen...
    ShowCursor(true);
    UnregisterClass("wndClass", hInstance);


In der Callback:

Quellcode

1
2
3
4
5
6
switch(msg)
{
    case WM_DESTROY:
             DX-Aufräum-Funktionen...
             PostQuitMessage(0);
             return 0; break;   


Beim Beenden irgendwo im Code:

Quellcode

1
PostQuitMessage(0);


Das Problem ist also: ich weiß nicht wann ich die DX-Aufräumfunktionen aufrufen soll und wann PostQuitMessage und wann UnregisterClass.

thx für n tip

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

05.06.2004, 23:03

PostquitMessage = sende WM_QUIT. Was man mit der nachricht macht ist egal. Man könnte dann ne Box erscheinen lassen, wo "ätsch" draufsteht.
Die Aufräumfunktion sollte zu mindest am Programm ende aufgerufen werden. Das lässt sich leicht machen, wenn man ne oberklasse macht die einen Destruktor hat der automatisch alles entläd. Wenn jetzt aus irgendinem Grund das Prog abstürzt oder beender wird, wird durch das löschen der instanz der Oberklasse alles entladen.

3

05.06.2004, 23:23

Wenn das Fentster gechlossen wird (case WM_DESTROY) könntest du es z. B. neu erstellen, oder das Programm beenden.
ShowCursor(true) hab ich noch nie benutz ebenso UnregisterClass(). Bin mir nicht sicher, aber AFAIK braucht man das nicht. Wo der Rest aufgerufen wird, ist eigentlich egal. Am besten aber alles bei WM_QUIT, oder eben nach der Hauptschleife. Für die Übersichtlichkeit ist es aber am besten alles an einer Stelle zu machen. Also egal wo, nur alles zusammen.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

05.06.2004, 23:39

Bei deiner Methode gibt es das Prob, dass wenn das Prog abstürzt nicht alles 100% sicher freigegeben wird... daher die sache mit der Instanz. Und man sollte alles freigeben auch, wenn man es nicht muss, denn auch wenn eigendlich alles automatisch aufgeräumt werden sollte, so kommt es doch vor, dass der PC manchen Befehl einfach überhört....

5

05.06.2004, 23:42

Ja, aber wenn das Programm abstürzt, ist es eh Mist und man muss es noch verbessern. Und nach einem Neustart ist ja alles wieder in Ordnung. Im Endstadium soll es ja nicht mehr abstürzen. Und selbst wenn, ein Neustart ist ja auch nicht so schlimm.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

6

05.06.2004, 23:58

Es reicht schon ein defekter treiber....aber man könnte die sicherheitsthreadtechnologie nutzen, wenn das prog ganz sicher sein muss.......

7

06.06.2004, 03:38

1) Ein Programm kann immer abstürzen. Es gibt keines das es nicht tut ;)
2) Bei 2000 und XP muss man nicht einmal den Speicher freigeben, da der Speichermanager hier jeglichen Speicher Automatisch löscht der von der jeweiligen Instanz erzeugt wurde.

Aber das spielt keine Rolle. Den Mist den man gemacht hat, soll man auch wieder hintersich aufräumen. Das beinhaltet auch den Aufruf von UnregisterClass. Die Methode von Nox ist eigentlich genau richtig und am einfachsten zu Realisieren.
Was die meisten aber nicht machen ist, sie benutzen keine Exceptions. Sie erlauben nicht nur das abfangen jeglicher Ausnahmen sondern darüber hinaus auch das sichere herrunterfahren des Projektes. Sollte das Prog z.B. unter 98 abstürzen ist nicht sichergestellt das z.B. der Reservierte Speicher freigegeben wird.

Eine gute Methode ist es das Projekt wie in der MFC als Objekt zu sehen. So erstellt man sich eine Klasse Application erstellen die dann alles Initialisiert und auch wieder frei gibt. Die WinMain ist daher bei mir eigentlich nur noch für den Eintritt ins Programm und wird komplett durch try catch gekapselt.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

8

06.06.2004, 10:42

Meines Wissens nach kostet die try catch Sache einwenig Leistung, also ne sache die manche Sache nit gegünstigt.

9

06.06.2004, 16:40

Wenn du in deinen Projekteinstellungen nachschaust, dann wirst du sehen das Exception Handling Standardmäßig immer an ist ;)

Hmm...mag sein das es etwas Performance kostet. Das ist jedoch unerheblich wenn man es nicht übertreibt. Auch die Verwendung von Virtuellen Methoden kostet extra Zeit. Trotzdem sagt da niemand etwas.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

10

06.06.2004, 17:37

Doch ich ;D ..ich habe in meiner Engine kein einzige virual drin.

Werbeanzeige