[C++] Shutdown nach Uhrzeit



  • Schönen guten Abend 🙂
    Ich hätte folgende Frage an Euch.
    Vorab ich habe schon wie wild im Internet nach Lösungen gesucht, bin aber leider nicht fündig geworden. Hoffentlich könnt Ihr mir weiterhelfen.

    Ich würde gerne ein C++ Programm schreiben mit dem ich zu einer bestimmten Uhrzeit einen Shutdown von Windows erzielen kann.
    Also Shutdowns in C++ per Sekunden Angabe etc ist kein Thema aber wie bekomme ich es mit einer Uhrzeit realisiert? Ich habe schon ein paar Ideen, glaube aber nicht das diese erfolgsversprechend sind.

    Ich dachte mir unter anderem das ich die aktuelle Zeit nehme, diese in Sekunden umwandele und Sie mit der angegeben Uhr ( auch in Sekunden umgewandelt ) subtrahiere und das Ergebnis per shutdown -t "xxxx" übergebe.

    Könnt Ihr mir hoffentlich weiterhelfen?

    Mit freundlichen Grüßen



  • buu2188 schrieb:

    Schönen guten Abend 🙂

    Ich dachte mir unter anderem das ich die aktuelle Zeit nehme, diese in Sekunden umwandele und Sie mit der angegeben Uhr ( auch in Sekunden umgewandelt ) subtrahiere und das Ergebnis per shutdown -t "xxxx" übergebe.

    Hast du das denn mal probiert?

    Sonst, Zeitdifferenz berechnen, so lange warten, und dann runter fahren.



  • Dankesehr ich werde mich später mal probieren 🙂

    Danke für die Hilfe
    Liebe Grüße



  • Also ich habe mich heute mal hingesetzt und soweit funktioniert mein Programm 🙂
    Schaut Euch es evtl nochmal an, falls Ihr Kritik, Lob oder Verbesserungsvorschläge habt gerne her damit 🙂

    Liebe Grüße

    #include <iostream>
    #include <sstream>
    #include <ctime>
    #include <windows.h>
    #include <iomanip>
    using namespace std;
    
    void shutdowner(int secondsdown)
    {
    	  //Shutdown
    	  stringstream ss;
    	  ss << "shutdown -s -t " << secondsdown;
    	  system(ss.str().c_str());
    }
    
    int shutdowndefine(int &hour,int &min,int &year, int &mon, int &mday)
    {
    
    	  cout << "Datum des Shutdowns definieren: " << endl;
    	  cin >> mday;
    	  if ( mday > 31 || mday < 1 )
    	  {
    		  cout << "Ungueltige Eingabe!" << endl;
    		  return 0;
    	  }
    	  else
    	  {
    		  cout << setfill('0');
    		  cout << setw(2) << mday << ".";
    	  }
    	  cin >> mon;
    	  if ( mon > 12 || mon < 1 )
    	  {
    		  cout << "Ungueltige Eingabe!" << endl;
    		  return 0;
    	  }
    	  else
    	  {
    		  cout << setfill('0');
    		  cout << setw(2) << mday << "." << setw(2) << mon << ".";
    	  }
    	  cin >> year;
    	  if ( year < 2017 )
    	  {
    		  cout << "Ungueltige Eingabe!" << endl;
    		  return 0;
    	  }
    	  else
    	  {
    		  cout << setw(2) << mday << "." << setw(2) << mon << ".";
    		  cout << year << " gespeichert!" << endl;
    	  }
    
    	  cout << "Uhrzeit des Shutdowns eingeben: " << endl;
    
    	  cin >> hour;
    	  if ( hour > 24 || hour < 0 )
    	  {
    		  cout << "Falsche Stundenangabe! ( Programm Ende )" << endl;
    		  return 0;
    	  }
    	  else
    	  {
    		  cout << setfill('0');
    		  cout << setw(2) << hour << ":";
    	  }
    	  cin >> min;
    	  if ( min > 59 || min < 0 )
    	  {
    		  cout << "Falsche Minutenangabe! ( Programm Ende )" << endl;
    		  return 0;
    	  }
    	  else
    	  {
    		  cout << setfill('0');
    		  cout << setw(2) << hour << ":" << min << " Uhr gespeichert!" <<endl;
    	  }
    	return 1;
    }
    
    int main ()
    {
     //Shutdownclock Variablen
      int hour;
      int min;
      int year;
      int mon;
      int mday;
      time_t now;
      struct tm newyear;
      double seconds;
      int cast;
    
      time(&now);  /* get current time; same as: now = time(NULL)  */
    
      newyear = *localtime(&now);
    
      shutdowndefine(hour,min,year,mon,mday);
    
      newyear.tm_hour = hour ; newyear.tm_min = min;
      newyear.tm_mon = mon - 1;  newyear.tm_mday = mday;
    
      seconds = difftime(mktime(&newyear),now);
    
      cast = int (seconds);
    
      shutdowner(cast);
    
      return 0;
    }
    


  • Du solltest den Shutdown nur ausführen, wenn eine gültige Eingabe gemacht wurde, d.h. den Rückgabewert von shutdowndefine überprüfen, sowie nur wenn die Differenz seconds positiv ist.



  • Also statt Return Type int, bool verwenden, also bei shutdowndefine?

    Sonst der Rest ist gut? 🙂

    Danke für die Info



  • buu2188 schrieb:

    Also statt Return Type int, bool verwenden, also bei shutdowndefine?

    Du gibst ja schon 0 im Fehlerfall zurück und 1 im Erfolgsfall. Du müsstest den Rückgabewert nur überprüfen. Du könntest mit unterschiedlichen Rückgabewerten sogar den Fehlerfall identifizieren und eine entsprechende Fehlermeldung ausgeben. Ich bin aber kein Freund von Return Codes in c++ und seit neueren C++ Versionen auch nicht mehr davon, Ergebnisse via Referenz zurück zu geben.

    Ich würde die Funktion shutdowndefine() ein entsprechendes Objekt zurück geben lassen, in dem die Eingabeinformationen stehen. Im Fehlerfall würde ich entweder direkt eine Fehlerausgabe ausgeben und eine erneute Eingabe verlangen, oder eine exception werfen.

    Die Zeit Funktionalität würde ich wahrscheinlich aus std::chrono (http://en.cppreference.com/w/cpp/header/chrono) nehmen anstelle der alten C Bibliothek (ohne das jetzt mal auprobiert zu haben).



  • Vielen Dank für die Tips, werde es dementsprechend fixen 🙂


Log in to reply