Während des laufenden Programms immer wieder etwas abfragen



  • Hallo,
    ich möchte gerne zwei Zeitstempel vergleichen - if(x >= y) - aber ohne eine While-Schleife zu nutzen, damit ich das Programm immer noch parallel bedienen kann... Ist das möglich ?

    Ich habe es auch schon in der While-Schleife der WinMain probiert 😃
    Aber die wird ja nur ausgeführt, wenn eine Message eingeht. Es soll aber auch möglich sein, dass das Programm im Hintergrund läuft und somit keine Message reingeht, aber trotzdem die Zeitstempel verglichen werden.

    Jemand eine Idee ?



  • @TKuehn
    a) du musst nicht auf eine Message warten. Wenn keine da ist, macht das Programm weiter (nicht gut).

    b) du kannst einen Timer starten, der regelmäßig eine Message absetzt.



  • Muss ich für den Timer einen eigenen Thread erzeugen ?
    Ich wüsste jetzt auf jedenfall nicht genau wie ich das mit dem Timer umsetzen sollte, damit es so klappt



  • Windows Anwendungen sind nachrichtengesteuert, deshalb brauchst du eine Message Pump (das hatten wir bereits in einem anderen Thread). Ein Timer macht nichts anderes, als in einem festgelegten Intervall eine Nachricht in die MessageQueue einzufügen, auf die du dann reagieren kannst.

    
    VOID CALLBACK my_timer_proc( HWND wnd, UINT msg, UINT_PTR id, DWORD time )
    {
    }
    
    int main()
    {
       ...
       SetTimer( nullptr,          // Nachricht ist für kein Fenster bestimmt, stattdessen wird ein Callback registriert
                 0,                // Ereignis-ID für Timer Nachricht, sollte ohne Fenster 0 sein
                 1000,             // 1000ms Intervall
                 &my_timer_proc ); // Callback, der vom Timer aufgerufen wird
       ...
       <MessagePump>  
    }
    

    PS:
    Die MSDN ist wirklich eine tolle Informationsquelle.



  • Danke, ich denke das wird mir helfen.

    PS: Ich bin nunmal ein Neuling und wusste nicht genau wonach ich suchen muss. Dafür gibt es doch solche Foren - oder bin ich da falsch ?



  • Ja und Nein.
    Natürlich soll dir hier geholfen werden, aber bei deinem Kenntnisstand soll das eher Hilfe zur Selbsthilfe sein. Wenn dir hier Stichworte genannt werden kann man in der MSDN fast immer Beispiele zu diesen Stichworten finden, und Doku zu lesen und zu verstehen gehört zum Programmieren dazu. Statt zu fragen "Ich habe keine Ahnung vom Thema ABC, erklär´ mal jemand." sollte der Weg eigentlich sein "Ich les´ mich da mal ein und melde mich, wenn ich Fragen dazu habe." Später dann "Ich habe das jetzt so und so gemacht (+Quelltext), aber es funktioniert nicht so, wie erwartet. Eigentlich sollte X passieren, aber es passiert Y."



  • Das hier: "Ich habe keine Ahnung vom Thema ABC, erklär´ mal jemand."
    ist auch keines Weges meine Einstellung. Ich bringe mir alles selber (und ja - auch freiwillig) bei und versuche dementsprechend auch zu verstehen.
    Ich habe unter Timer bloß leider vieles verschiedenes gefunden und wusste daher nicht, worauf DirkB hinaus wollte - also fragte ich lieber nochmal nach.
    Ich bin auf jeden Fall dankbar für eure Hilfe..



  • wenn du generell einen thread erzeugst, damit eingaben und berechnungen getrennt sind, kannst du das programm doch parallel mit while-schleife bedienen und immer die zeiten abfragen und auswerten. eigentlich macht man das auch so.



  • Ich habe versucht unterschiedliche Threads zu erzeugen, um das parallel machen zu können, ja - aber ich blicke da ehrlichgesagt noch nicht so ganz durch. Deshalb versuche ich es nun mit dem Timer - das würde für mein Programm auch ausreichen



  • erlaubst du mir die frage, was du da genau machen willst?



  • Ich möchte mir ein Programm erstellen, in dem ich eine Minuten-Eingabe in einem Edit mache, per Start-Button werden dann zwei Zeitstempel erstellt ( sagen wir x und y). Auf y werden dann die Eingegebenen Minuten drauf gerechnet und wenn y >= x ist, soll sich der Computer Herunterfahren.

    Das ist das Grundprinzip, was ich mir überlegt habe.

    EDIT: Soweit funktioniert die Anwendung auch. Nur das mit dem Vergleichen der Zeitstempel hapert gerade noch



  • @Wade1234 sagte in Während des laufenden Programms immer wieder etwas abfragen:

    kannst du das programm doch parallel mit while-schleife bedienen und immer die zeiten abfragen und auswerten. eigentlich macht man das auch so.

    Das belastet aber den Prozessor, wenn man keine Wartezeit drin hat.
    Das hängt natürlich auch von der Genauigkeit/Häufigkeit der Zeitstempel ab.

    Aber die Zeitstempel werden ja zu einem Ereignis gehören. Dies kann eine Message absetzen und darauf hin der Vergleich erfolgen



  • @TKuehn sagte in Während des laufenden Programms immer wieder etwas abfragen:

    Danke, ich denke das wird mir helfen.
    PS: Ich bin nunmal ein Neuling und wusste nicht genau wonach ich suchen muss. Dafür gibt es doch solche Foren - oder bin ich da falsch ?

    Wir wissen leider auch nicht, wie weit wir dir helfen sollen/müssen, damit du die richtigen Informationen findest.
    Manchmal sind es auch nur falsch verstandene Begriffe. Aber das kann man eigentlich nur im Dialog klären und nicht mit einer ersten allumfassende Antwort.



  • also im prinzip sowas:

    void StartButtonClicked(...)
    {
         //zeit zum herunterfahren berechnen
    
         //wenn das system noch nicht heruntergefahren werden soll: thread erstellen
    }
    
    DWORD ThreadProck(LPVOID data)
    {
         for(;;)
         {
              //momentane systemzeit ermitteln
    
              //rechner herunterfahren, wenn die systemzeit den zeitpunkt zum herunterfahren erreicht hat
    
              //thread schlafen legen, um die cpu zu schonen
         }
    
         return 0;
    }
    

    ?



  • @DirkB sagte in Während des laufenden Programms immer wieder etwas abfragen:

    @Wade1234 sagte in Während des laufenden Programms immer wieder etwas abfragen:

    kannst du das programm doch parallel mit while-schleife bedienen und immer die zeiten abfragen und auswerten. eigentlich macht man das auch so.

    Das belastet aber den Prozessor, wenn man keine Wartezeit drin hat.

    also ich habe es irgendwann einmal so gelernt, dass man sleep mit 50, 100, 250, 500 oder 1000 ms aufruft, bzw. bei echtzeitsystemen eben die differenz zu diesen werten.



  • Also Ich habe jetzt zwei verschiedene Arten von Timerfunktionen getestet:
    1.:

    #define ID_TIMER 0
    
    void CALLBACK myTimerproc(HWND, UINT, UINT_PTR, DWORD);
    
    int WINAPI WinMain(...){
           SetTimer(nullptr, ID_TIMER, 1000, &myTimerproc);
    }
    
    void CALLBACK myTimerproc(HWND hWnd, UINT msg, UINT_PTR id, DWORD time) {
    	switch (msg) {
    	case WM_TIMER:
    		switch (id) {
    		case ID_TIMER:
    			vergleicheZeitstempel();
    		}
    	}
    }
    

    Hier scheint das Programm nicht in die Funktion "vergleicheZeitstempel" zu gehen. Diese wird jedenfalls nicht ausgeführt.

    und 2.:

    #define ID_TIMER 0
    
    int WINAPI WinMain(...){
           SetTimer(MainhWnd, ID_TIMER, 1000, (TIMERPROC)NULL);
    }
    
    LRESULT CALLBACK MainWindowProcedure(.., UINT  msg, WPARAM wp, ..) {
    	switch (msg) {
            case WM_TIMER:
    		switch (wp) {
    		case ID_TIMER:
    			cout << "Test" << endl;
    			vergleicheZeitstempel();
    			break;
    	         }
             }
    }
    

    Hierbei beenden sich das Programm einfach nach ca. 1-2 Sekunden.
    Ohne dass ich den Button drücke



  • @Wade1234 Ja so in die Richtung, wenn ich es denn mit Threads machen würde. Momentan versuche ich es halt noch mit dem Timer.



  • @TKuehn hast du mal versucht, den timer unter WM_CREATE zu erstellen? die winmain lässt man nämlich eigentlich unangetastet. und wenn du dann schon dabei bist, solltest du SetTimer eigentlich unter WM_LBUTTONDOWN bzw. in der dem button zugeordneten funktion aufrufen, da der timer ja erst laufen soll, wenn der button auch betätigt wurde.

    ansonsten: guck dir nochmal den beispielcode bzw. für das erste programm allgemein die übergabe von funktionszeigern an.



  • Ja, natürlich erst, wenn der Button gedrückt wurde. Ich war zu sehr auf den Rest fokussiert 😃
    Ich hatte eine Bedingung von einer If-Abfrage auch nicht richtig definiert - Nun funktioniert es.
    Danke dir !



  • Das Programm ist nun fertig.
    Alle Funktionen funktionieren einwandfrei.
    Es fehlt nur noch ein Icon und eventuell ein wenig Farbe.

    Ich würde es gerne, bei Interesse, hochladen und um Verbesserungsvorschläge bitten.
    Die Funktion, dass der PC herunterfährt, habe ich dafür natürlich auskommentiert -> Es wird sich nach der eingegeben Zeit nur das Programm beenden.


Anmelden zum Antworten