SYSTEMTIME im NeHe - code funzt nicht ....



  • nabend!

    ich will nen kleinen kalender programmieren, auf grundlage des NeHe - codes.
    natürlich ist dafür

    SYSTEMTIME zeit;
     GetSystemTime(&zeit);
    

    unerlässlich und funktioniert auch in jedem "normalen" code wunderbar.

    da das prog nur am start das datum abfragen soll, trage ich die GetSystemTime - abfrage direkt in die WinMain, noch vor der schleife, ein. (die zeit - variable kommt natürlich ganz oben in den kopf)
    folge: das programm minimiert sich wenn ich es starte und spricht nicht mehr an.
    wenn ich allerdings die abfrage in die DrawGLScene, also in die ständig ablaufende schleife, schreibe, funktioniert alles wunderbar. warum?!

    für die NeHe - unerfahrenen hier nochmal die main:

    [cpp]
    int WINAPI WinMain( HINSTANCE hInstance, // Instance
    HINSTANCE hPrevInstance, // Previous Instance
    LPSTR lpCmdLine, // Command Line Parameters
    int nCmdShow) // Window Show State
    {
    MSG msg; // Windows Message Structure
    BOOL done=FALSE; // Bool Variable To Exit Loop

    // wenn ich die abfrage hier habe, stürzt das programm ab //
    SYSTEMTIME zeit;
    GetSystemTime(&zeit);

    fullscreen=FALSE; // Windowed Mode

    // Create Our OpenGL Window
    if (!CreateGLWindow("SirNoname`s modified NeHe - code 2",800,600,16,fullscreen))
    {
    return 0; // Quit If Window Was Not Created
    }

    while(!done) // Loop That Runs While done=FALSE
    {
    if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) // Is There A Message Waiting?
    {
    if (msg.message==WM_QUIT) // Have We Received A Quit Message?
    {
    done=TRUE; // If So done=TRUE
    }
    else // If Not, Deal With Window Messages
    {
    TranslateMessage(&msg); // Translate The Message
    DispatchMessage(&msg); // Dispatch The Message
    }
    }
    else // If There Are No Messages
    {
    // Draw The Scene. Watch For ESC Key And Quit Messages From DrawGLScene()
    if (active) // Program Active?
    {
    if (keys[VK_ESCAPE]) // Was ESC Pressed?
    {
    done=TRUE; // ESC Signalled A Quit
    }
    else // Not Time To Quit, Update Screen
    {
    DrawGLScene(); // Draw The Scene
    SwapBuffers(hDC); // Swap Buffers (Double Buffering)

    // an dieser Stelle jedoch funktioniert es //
    SYSTEMTIME zeit;
    GetSystemTime(&zeit);
    }
    }
    }
    }

    // Shutdown
    KillGLWindow(); // Kill The Window
    return (msg.wParam); // Exit The Program
    }
    [/cpp]

    danke für eure hilfe!



  • Das ist aber sehr seltsam 😕 😞
    Abstürtzen heißt, du bekommst einen Speicher-Zugriffs-Fehler, oder was genau? Hast du dein Programm mal über den Debugger gestartet?



  • stimm ich dir zu, sehr sehr merkwürdig sogar. ka ob es am rest des codes liegt, halte ich aber für unwahrscheinlich.

    abstürzen = unten in der taskleiste wird es zwar angezeigt, aber das fenster an sich öffnet sich nicht. und: das prog braucht auf einmal fast 50 % meiner ressourcen ... und das is viel denn ich hab nen schnellen rechner. ... sieht verdammt nach ner endlosschleife aus ...



  • hi,

    koennte es vielleicht sogar ein windows problem sein? die frage ist ab wann es ein richtiger prozess wird? normalerweise wuerde ich sagen wenn das prog gestartet wird, also sobald die winapifunktion aufgerufen wird. vielleicht ist es aber nicht so und du musst erst ein fenster erzeugt haben.
    ich habe jedenfalls auch sowas noch nicht gesehen.

    gruss
    msp



  • Wo greifst du auf die "zeit"-Variable zu und was machst du damit ?



  • das Problem liegt defenitiv woanders, bzw. müßte man mal die Funktion "CreateGLWindow" sehen (ist bei GL ja nicht so lang wie bei D3D).
    Meine Vermutung ist, das durch den Aufruf der API Funktion, Windows deinem Programm da bereits automatisch Rechenzeit zu ordnet und durch den gefolgten Aufruf von GL unterworfen wird und die sich um die prirorität kloppen, was zur Thread überlast führt und weitere Funktionen nicht folgen.
    Es könnte ein Sleep(0) helfen um Windows ne runde warten zu lassen, oder die Initalisierung abarbeiten und dann GetSystemTime() aufrufen, direkt vor Eintritt in die Schleife.


Anmelden zum Antworten