DirectX und Ruhezustand



  • Hi,

    kennt sich jemand mit DirectX und Ruhezustand von Windows aus?
    Mein Programm ist ein DirectX Programm. Wenn der PC nun in den Ruhezustand versetzt wird, stürzt das Programm beim wieder "aufwecken" ab.

    StackTrace:

    ERROR: SymGetLineFromAddr64, GetLastError: 487 (Address: 72FD15AC)
    72FD15AC (d3d9): (filename not available): DebugSetMute

    ERROR: SymGetLineFromAddr64, GetLastError: 487 (Address: 65139A70)
    65139A70 (d3dx9_40): (filename not available): D3DXDebugMute
    b:\_source\c++\programme\sally\sally\sallyapp.cpp (184): CSallyApp::RenderGUI
    b:\_source\c++\programme\sally\sally\sallyapp.cpp (168): CSallyApp::RenderEx
    d:\c++\programme\sally\sallyapi\game.cpp (654): SallyAPI::Core::CGame::Render
    d:\c++\programme\sally\sallyapi\game.cpp (631): SallyAPI::Core::CGame::ExecuteGame
    d:\c++\programme\sally\sallyapi\game.cpp (253): SallyAPI::Core::CGame::GameLoop
    b:\_source\c++\programme\sally\sally\main.cpp (181): WinMain
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (578): __tmainCRTStartup

    b:\_source\c++\programme\sally\sally\sallyapp.cpp (184): CSallyApp::RenderGUI

    void CSallyApp::RenderGUI()
    {
    	if (m_pSpriteInterface != NULL)
    		m_pSpriteInterface->Begin(D3DXSPRITE_ALPHABLEND);
    
    	m_pCamera->SetupGUICamera();
    
    	(*m_ppGUICurrent)->Render();
    
    	if (m_pSpriteInterface != NULL)
    		m_pSpriteInterface->End();
    }
    

    Die stelle hier wäre m_pCamera->SetupGUICamera(); ... ist auch nicht NULL (wäre ja auch komisch) aber irgendwie wird es nicht richtig restored.

    Kennt sich jemand damit aus? Oder einen Artikel darüber?



  • Ach ja, so was wie DeviceLost funktioniert...
    Ist nur der Ruhezustand wo es Abstürzt.



  • Hmm. Ich hätte gesagt, dass das genau gleich, wie bei Device Lost verhält.. Habs selbst aber denke ich noch nie ausprobiert. 😉

    Was sagt denn der DX-Debug Output?



  • Hallo,

    Die stelle hier wäre m_pCamera->SetupGUICamera(); ... ist auch nicht NULL (wäre ja auch komisch) aber irgendwie wird es nicht richtig restored.

    Also Zeile 184, oder?

    Hmm, ich kenne DirectX nicht, bin eher auf OpenGL-Schiene unterwegs. Aber dennoch ein paar Fragen:
    - Was macht SetupGUICamera()?
    - Was nutzt du für GUI? WinForm?

    Wenn du den Fehler eingrenzen kannst, erstelle ein Projekt im ein paar Zeilen und versuch weiter das Problem einzugrenzen.
    Ich freue mich schon auf deine Antwort. Interessantes Problem 😃



  • m_pCamera ist eine Instance von CCamera. Ist meine eigene Klasse.

    Ich denke mal der Speicherbereich ist nicht gültig - wurde also nicht richtig restored...

    Für die ganze GUI habe ich eigene Klassen gebaut.
    Das ganze ist schon sehr komplex da es Themeing Unterstützung hat und Localisierung der GUI Texte während der Laufzeit.
    Ist für folgendes Project: http://www.sally-project.de

    Was ich jetzt mal mache, ich update auf das neuste SDK von Windows und DirectX.
    Mal schauen ob das hilft.



  • Kann leider nicht helfen aber wollte mal sagen, dass ich das projekt interessant finde 👍 🙂


  • Mod

    find ich auch nett 🙂

    -versuch mal mit refras laufen zu lassen
    -neuste treiber drauf hauen
    -andere systeme ausprobieren
    -eventuell liegt es ja nicht am ruhezustand, sondern weil so ne lange pause passiert, vielleicht hast du irgendwo ne zeitabfrage die nicht damit klarkommt dass ploetzlich 1min vergangen ist statt wie sonst ms. bau einfach irgendwo ein sleep von einer minute ein den du abrufen kannst (z.b. if(GetAsyncKeyState(VK_SPACE))Sleep(60*1000); )
    -versuch mal den ruhezustand mit etwas anderem, nem spiel oder so und schaue ob es dann noch geht, eventuel findest du so nen driver/hardware bug
    -devicelost ist nicht immer gleich, wenn du z.b. von fullscreen zu windowed wechselst scheint es meiner erfahrung nach weniger riskannt zu sein als wenn du von einem strg+alt+entf zurueck kommst (hatte selbst schon dass das eine ging und das andere nicht), probier beides mal aus.

    notfalls wuerde ich an deiner stelle versuchen herauszufinden wenn ein ruhezustand einsetzt (vielleicht gibt's ein windows event?) und dann alles sichern und das program in einen safe zustand bringen und beim neuen start dann alles frisch laden.



  • Anhand des Call-Stacks ist ja ziemlich klar zu erkennen, dass der Crash in der Funktion D3DXDebugMute passiert.
    Wieso gehst du also davon aus, dass der Speicher eines deiner eigenen Objekte "kaputt" wäre?



  • Danke für den Response 🙂

    @raspo:
    devicelost ist nicht immer gleich, wenn du z.b. von fullscreen zu windowed wechselst scheint es meiner erfahrung nach weniger riskannt zu sein als wenn du von einem strg+alt+entf zurueck kommst (hatte selbst schon dass das eine ging und das andere nicht), probier beides mal aus.

    => Device Lost wird auch bei strg+alt+entf oder nach dem sich der Computer gesperrt hat richtig behandelt.
    Den selben Effekt hatte ich aber auch am Anfang 😃

    Die anderen Sachen werde ich am Wochenende mal testen.

    @hustbaer:
    Mh ja, stimmt eigentlich... ist ne blöde Annahme von mir gewesen.
    Wenn ich jetzt so darüber nachdenke, hab ich keine Ahnung wie ich darauf gekommen bin 😕



  • Also ich habe auf dem System mal ein ein paar Spiele laufen lassen... manche kommen damit zurecht, manche nicht.

    Hab auch mal das Platform SDK und das DirectX SDK upgedated - hat aber auch nix gebracht. Ich such mal weiter.



  • lol, ich habs gefunden!!!

    Wenn der PC in Ruhezustand geht und dann wieder aufgeweckt wird, bekomme man bei m_pDirect3DDevice->TestCooperativeLevel() nicht D3DERR_DEVICELOST und dann D3DERR_DEVICENOTRESET sondern nur ein D3DERR_DEVICENOTRESET.

    => bei D3DERR_DEVICELOST hab ich bei SpriteInterface und die Fonts OnLostDevice() aurgerufen. Das ist natürlich nicht passiert => crash

    Jetzt gehts! Danke an alle!


Anmelden zum Antworten