|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Compuholic Mini JLI'ler
Anmeldedatum: 15.10.2002 Beiträge: 25
Medaillen: Keine
|
Verfasst am: 20.01.2003, 18:00 Titel: EXE kann nicht geschrieben werden |
|
|
Ich habe grade ein seltsames Problem:
Ich habe versucht eine DirectDraw Testanwendung zu schreiben, die einfach nur ein Rechteck auf eine Oberfläche blittet. Wenn das Programm aber einmal gestartet wurde kann ich keine Änderungen mehr kompilieren "DirectDrawTest.exe kann nicht zum Schreiben geöffnen werden". Offensichtlich wird das Programm nicht mehr korrekt beendet. Es taucht aber weder im Task-Manager, noch in der Prozessliste auf. Alle Objekte werden beim Beenden wieder released.
Nachdem das Programm einmal gestaret wurde geht auch die Performance des ganzen Systems in die Knie. Nur ein Reboot behebt das Problem.
Hier ein Auszug aus der Hauptschleife und der Callback-Funktion:
Code: |
[...]
hWnd = CreateMainWindow(hInstance);
if (FALSE == DDrawInit(hWnd))
{
exit(0);
}
while (GetMessage(&msg, hWnd, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
if (FALSE == CleanUp())
{
MessageBox(hWnd, "Fehler beim Beenden der Verbindung zu DDraw", "Fehler...", MB_OK);
}
return 0;
}
LRESULT CALLBACK MessageHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
BOOL CleanUp()
{
if (lpDDSPrimary != NULL) { lpDDSPrimary->Release(); }
else { return FALSE; }
if (lpDDClipper != NULL) { lpDDClipper->Release(); }
else { return FALSE; }
if (lpDD7 != NULL) { lpDD7->Release(); }
else { return FALSE; }
return TRUE;
}
|
Hat jemand eine Erklärung dafür.
Danke |
|
Nach oben |
|
|
Salim Mini JLI'ler
Anmeldedatum: 29.12.2002 Beiträge: 12
Medaillen: Keine
|
Verfasst am: 20.01.2003, 19:24 Titel: hmmm... |
|
|
Soso,
also gut. Schau erstmal nach ob die exe-Datei schreibgeschützt ist.
Irgendwie gefällt mir dein Programmierstil nicht. Aber das spielt ja jetzt keine große rolle. Wie wärs wenn du die Hauptschleife so ändern würdest:
Code: |
while (GetMessage(&msg, [b]NULL[/b], 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
|
Ich würde dir noch empfehlen lieber PeekMessage zu benutzen, aber das ist ja auch egal.
Probiers mal. Sag mir dann obs geklappt hat. Interressiert mich. _________________ A.Salim Doost
www.asdnet.de
Es gibt immer einen besseren |
|
Nach oben |
|
|
Compuholic Mini JLI'ler
Anmeldedatum: 15.10.2002 Beiträge: 25
Medaillen: Keine
|
Verfasst am: 20.01.2003, 20:31 Titel: |
|
|
So, ich denke ich habe den Fehler.
Jedenfalls kann ich wieder ohne Probleme kompilieren (so oft ich will )
Das Programm führt die Befehle nach der Nachrichtenschleife nie aus. Ich vermute mal das über DefWindowProc() die Anwendung direkt nach PostQuitMessage() terminiert wird.
Ich habe auf jeden Fall mal die "Aufräum-Funktion" in die Behandlungsroutine für WM_DESTROY reingepackt und voilà alles funktioniert prima. Wahrscheinlich wurden die DirectDraw Objekt nicht richtig freigegeben, die dann offenbar den Fehler verursacht haben. |
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 20.01.2003, 21:35 Titel: |
|
|
Dein Beschriebenes Problem taucht immer dann auf, wenn eine Anwendung - wie du bereits richtig vermutet hast - nicht beendet wird. Die Ausfürhbare Datei ist dann nämlich schreibgeschützt und andere Prozesse (In dem Fall der Kompiler / Linker) können nicht auf die Exe zugreifen.
Das Performaceproblem solltest du aber auf jeden Fall noch lösen, egal, ob das Programm jetzt ordendlich beendet wird oder nicht.
AFE-GmdG _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
|
Compuholic Mini JLI'ler
Anmeldedatum: 15.10.2002 Beiträge: 25
Medaillen: Keine
|
Verfasst am: 20.01.2003, 21:57 Titel: |
|
|
Das Performance-Problem hat sich mit der Lösung des Problems in Wohlgefallen aufgelöst.
Keine Ahnung an was das lag. Vielleicht gab es irgendwo noch Konflikte mit den belegten Ressourcen. But: who cares... |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|