Frage zu Threads



  • Habe mal ne kleine Frage zum Thema Thread:

    Ich möchte das Beispiel "Turm von Hanoi" grafisch in der SDI darstellen, dabei soll die Steine schrittweise sichtbar umgestapelt weren! Der Algorithmus des Turms von Hanoi ist ja eine rekursive Funktion! Damit mir die Ansicht nicht einfriert während der Berechnung, wollte ich dazu einen extra Thread aufmachen! Dabei stellt sich mir die Frage: Wie kann ich nun in diesem Thread die rekursive Funktion aufrufen! Ich kann ja wohl nicht den Thread mehrmals starten?
    Kann mir da jemand eine schlüssige Antwort senden?

    Besten Dank im voraus



  • void RekursiveFuntkion()
    {
      // ...
    }
    
    DWORD WINAPI Thread(VOID*)
    {
      RekursiveFuntkion();
    }
    

    PS: Aber warum brauchst Du für "Türme von Hanoi" ein Thread??? Was hast Du denn für eine Berechnung? Das geht doch in ms...



  • Jochen Kalmbach schrieb:

    PS: Aber warum brauchst Du für "Türme von Hanoi" ein Thread??? Was hast Du denn für eine Berechnung? Das geht doch in ms...

    vielleicht muss er noch den Turm <bauen>? 😉



  • Das ist meine Funktion hanoi!

    void CHanoiView::hanoi(int n, int a, int z, int h)
    {
    CHanoiDoc *pDoc=GetDocument();
    if (n>0)
    {
    hanoi(n-1,a,h,z);
    CHanoiDoc::stein temp1;
    temp1 =pDoc->m_Steine.GetAt(n-1);
    temp1.Position=z;
    Sleep(600);
    pDoc->m_Steine.SetAt(n-1,temp1);
    TRACE("Stein %d müsste jetzt auf Turm %d liegen!\n",temp1.Nummer,temp1.Position);
    GdiFlush();
    //Invalidate(true);
    hanoi(n-1,h,z,a);
    }
    }

    Wenn ich das Fenster neu zeichnen will, z.b. mit Invalidate(true) passiert das nicht (Zeichenfunktionalität ist natürlich unter OnDraw() , das Programm friert komplett bis zum Ende der Funktion ein und der Turm wird komplett auf den Zielstapel neu gemalt! Im Debugmodus wird dabei aber mit TRACE alles ordentlich und schrittweise in das Ausgabefenster geschrieben nur die Türme werden halt nicht schrittweise neu gemalt!

    Der Aufruf der Funktion Hanoi erfolgt aus OnDraw();



  • Was soll denn hier Schrittweise gemalt werden???
    Sleep ist ganz schlecht...
    Verwende bitte SetTimer und mache die Schritte in der WM_TIMER Nachricht... mit Sleep blokierst Du nur alles...


Anmelden zum Antworten