[wxWidgets / evtl verschieben] pause funktion ?



  • heo

    wie kann ich ein Programm pausieren (ich will dass zb ein Wert für 1 s angezeigt wird und dann durch einen neuen erstetzt wird)

    ich habs mit sleep versucht nur irgendwie klappt das nicht ganz.

    (ich benutze linux...)



  • usleep() ?



  • ja das programm sollte auch auf windows ausführbar sein....

    oke ich hab mich verschaut, nur die usleep() von PHP gibts auf windows nicht!?



  • Dann bastelst du dir halt eine kleine Funktion im Stil von:

    void my_sleep(uint msec)
    {
        #ifdef WIN32
        rufe_windows_sleep_func_auf()
        #else
        rufe_unix_sleep_auf()
        #endif
    }
    


  • ja so weit so gut aber irgendwie bekomme ich nicht das richtige ergebnis

    also das Programm gibt einen vektor aus....
    einmal vor dem sortieren und dann danach und da ich ja auch die erste ausgabe sehen will muss ich das programm irgendwie anhalten

    m_lp->DrawVector(10,10,dc,pFeld);
    	   usleep(200000); //sollte das Programm für 2 sec anhalten
    
               pFeld = sort(pFeld);
               m_lp->DrawVector(10,10,dc,pFeld);
    

    es taucht jedoch folgendes Problem auf, es erscheint 2 sec lang GAR KEINE Ausgabe und dann der schon sortierte vektor..... (sieht so aus als ob das Programm zuerst pausiert und dann beide ausgaben unmittelbar hintereinander ausführt, aber warum, hängt das mit wxwidgets zusammen??)

    gibt es da eine Erklärung??

    mfg



  • hast du eventuell einfach nur "\n" als Zeilenumbruch bei der Ausgabe angegeben?

    std::endl; schreibt nämlich nicht nur einen Zeilenumbruch in den Stream, sindern flught ihn auch gleichzeitig, so dass alles direkt rausgeschrieben wird.



  • also ich gebe gar nichts textuell aus....

    void LeftPanel::DrawVector( int x, int y, wxDC &dc, vector<double>* pFeld )
    {
    
    	vector<double>::iterator end = pFeld->end();
    	int dx=10;
    
    	dc.Clear();
    	for(vector<double>::iterator i = pFeld->begin(); i != end; i++)
    	{
    		  dc.DrawLine( x+dx, y, x+dx, y+*i );
    		  dx = dx + 10;
    	}
    
    }
    

    ich gebe die Elemente grafisch aus, oder hab dies zumindest vor aber aus irgend einem Grund funktioniert das usleep() nicht wie beschrieben und ich weis nicht warum (kann es sein dass die erste DrawVector Anweisung einfach überschrieben wird oder so?..)

    mfg



  • Ich kenn mich jetzt zwar nicht mit wxDC aus, eventuell solltest du einen Refresh und ein Update der Benutzeroberfläche machen, damit die neuen Werte gezeichnet werden.



  • Hallo

    wxWidgets besitzt eine eigene, portable wxSleep-Funktion.
    Aber auch dabei wird deine Anwendung scheinbar einfrieren, weil die GUI währenddesen gar keine Messages mehr verarbeitet.
    Benutzt lieber wxTimer dafür. Wenn du bei jedem Timeraufruf ein neues wxDC aufmacht (und wieder schließt), brauchst du auch nicht manuell die GUI zu aktualisieren.

    bis bald
    akari



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Andere GUIs - Qt, GTK+, wxWidgets verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • ja dass das Programm einfriert ist mir klar.....
    aber unter windows mit der Sleep Funktion passt alles nur usleep verhält sich anderes..

    um das einfieren zu verhindern kann ich auch das programm in mehrere threads zerlegen oder?



  • Hallo

    Ein zusätzlicher Thread reicht. Wenn das Schema ist "tue aller x Sekunden etwas" dann reicht auch ein wxTimer.

    bis bald
    akari


  • Mod

    Würde dir auch zu wxTimer raten. Damit kannst du eine Funktion alle x Sekunden aufrufen.



  • nur leider habe ich keine ahnung wie ich soetwas machen kann...
    kann mir da jemand auf die sprüung helfen?

    mfg


  • Mod



  • ja aber ich glaub in meinem Fall kann ich keine wxTimer verwenden...

    vector<double>* Communicate::insertion(Communicate *comm)
    {
        wxClientDC dc(m_rp);  //Context zur grafischen Ausgabe
    	vector<double>::iterator k,i,end,begin;
    	double v; //einzufuegendes Element
    	int anz = 1;
    
    	begin = pFeld->begin();
    	end   = pFeld->end(); // $end auf das Ende von $pFeld setzen
    
    	for(k = pFeld->begin(); k !=  end; k++) // Elemente der Reihe nach auswaehlen
    	{
    
    		v = *k; // $v auf aktuelles ($k-tes) Element setzen
    		i = k;
    
            m_lp->DrawVector(10,10,dc,pFeld); //Ausgabe des aktuellen Inhalts des vectors $pFeld
    
    		// ----- die $k-ten Elemente einfuegen ------------
    		while( i > begin && v < *(i-1) ) // Elemente nach rechts verschieben
    		{
    
    			*i = *(i-1);
    			i--;
    			m_lp->DrawVector(10,10,dc,pFeld); //Ausgabe des aktuellen Inhalts des vectors $pFeld
    		}
    
    		*i = v; //$k-tes Element an einfuegen
    		anz++;
    	}
        m_lp->DrawVector(10,10,dc,pFeld); //Ausgabe des aktuellen Inhalts des vectors $pFeld
    	return pFeld;
    }
    

    also mit DrawVector wird der aktuelle Inhalt des Vectors pFeld ausgegeben und in DrawVector wird das Programm für 1 s angehalten um die Werte betrachten zu können.....

    Aber wenn ich DrawVector per wxTimer nur jede Sekunde aufrufe wird ja währenddessen weitersortiert oder? und dann kann man den Sortierverlauf nicht mehr nachvollziehn (und das sollte der Sinn des Programms sein ;-))

    oder sehe ich das falsch, dass hier nur ein zusätzlicher Thread hilft?


  • Mod

    Hm, wieso nimmst du für das Zeichnen nicht einfach eine OnPaint methode?

    Dann könntest du einen Timer entsprechend setzten, der dann die Sortierung schrittweise vornimmt, und danach Refresh() aufruft, was die OnPaint auslöst.

    Sortierung und Ausgabe solltest du trennen, das ist einfach sauberer.



  • hm ja meinst du ich sollte DrawVector nicht im Sortierverfahren aufrufen?
    Ich denke ich weis was du meinst aber ich habe keine Ahnung wie ich das Sortierverfahren so zerstückeln soll, dass es immer nur einen Schritt sortiert und dann zurück springt.....

    aber am Wochenende werde ich mir sowieso wieder ein wxwidgets Buch zu Gemüte führen^^


  • Mod

    Du müsstest das Sortierverfahren halt so aufsplitten, das du bei jedem Funktions/Timeraufruf um eins weiter sortiert.

    Oder du sortierst in einem Thread, und schickst den Zustand dann jeweils mit einem Event an das Hauptfenster, bevor du für den Thread sleep aufrufst.



  • jup das mit dem Thread haut hin aber noch eine Frage zu DrawLine, die Paramter x und y werden ja vom linken oberen Punkt des Fensters aus gezählt, gibts eine einfache Möglichkeit, dass ich den linken unteren Punkt als Bezugspunkt wähle oder muss ich da umständlich die aktuelle Größe des Fenster herausfinden....?


Anmelden zum Antworten