PC herunterfahren nach bestimmter Zeit



  • Hallo,

    ich kenne mich noch nicht so gut aus bei der Programmierung mit C ... hab aber vor ein kleines Programm zu basteln was mein PC nach ner eingegebenen zeit herunterfährt ... zb zum musik hören und dann geht der PC nach ner eingegebenen Zeit selbst aus ...

    hab gedacht wird doch kein Problem sein einfach "shutdown -f -s -t parameter" der console übergeben ...

    aber iwie will das ganze nicht so wie ich will

    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <string.h>
    
    int main(int argc, char** argv) {
        char taste;
        char *code;
        char codetime[50];
        char codestring[] = "shutdown -f -s -t ";
    
        printf("Shutdown Programm");
        printf("\n\n [1]   Zeit festlegen bis der PC herunterfährt");
        printf("\n [2]   Herunterfahren abbrechen");
        printf("\n [ESC] Programm beenden ...");
    
        while (1) {
            if (kbhit()) {
                taste = getch();
                switch (taste) {
                    case(27) : return (0);
    
                    case('1') : {
                            printf("\n\nBitte Zeit bis zum herunterfahren in Sekunden eingeben : ");
                            gets(codetime);
    
                            code=(char*)malloc(sizeof(char)*100);
                            strcpy(code, codestring);
                            code = strcat(code, codetime);
    
                            system(code);
                            return(0);
    
                        }
    
                    case('2') : {
    
                            system("shutdown -a");
                            break;
                        }
                }
            }
        }
        return (0);
    }
    

    eigentlich sollte das Programm in case('1') den befehl an die console übergeben und sich dann beenden ... macht es aber nicht ...

    stattdessen kommt wieder das menü was eig oberhalb der schleife steht ... da kann das programm doch gar nicht mehr hinkommen ...

    das versteh ich nicht ganz

    hat da jemand einen tipp für mich 😞

    MfG
    Pascal



  • EDIT: War Quatsch...



  • für welches os soll das sein?

    lg lolo



  • PASCAL8800 schrieb:

    Hallo,

    ich kenne mich noch nicht so gut aus bei der Programmierung mit C ... hab aber vor ein kleines Programm zu basteln was mein PC nach ner eingegebenen zeit herunterfährt ... zb zum musik hören und dann geht der PC nach ner eingegebenen Zeit selbst aus ...

    hab gedacht wird doch kein Problem sein einfach "shutdown -f -s -t parameter" der console übergeben ...

    aber iwie will das ganze nicht so wie ich will

    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <string.h>
    
    int main(int argc, char** argv) {
        char taste;
        char *code;
        char codetime[50];
        char codestring[] = "shutdown -f -s -t ";
    
        printf("Shutdown Programm");
        printf("\n\n [1]   Zeit festlegen bis der PC herunterfährt");
        printf("\n [2]   Herunterfahren abbrechen");
        printf("\n [ESC] Programm beenden ...");
    
        while (1) {
            if (kbhit()) {
                taste = getch();
                switch (taste) {
                    case(27) : return (0);
    
                    case('1') : {
                            printf("\n\nBitte Zeit bis zum herunterfahren in Sekunden eingeben : ");
                            gets(codetime);
    
                            code=(char*)malloc(sizeof(char)*100);
                            strcpy(code, codestring);
                            code = strcat(code, codetime);
    
                            system(code);
                            return(0);
    
                        }
    
                    case('2') : {
    
                            system("shutdown -a");
                            break;
                        }
                }
            }
        }
        return (0);
    }
    

    eigentlich sollte das Programm in case('1') den befehl an die console übergeben und sich dann beenden ... macht es aber nicht ...

    stattdessen kommt wieder das menü was eig oberhalb der schleife steht ... da kann das programm doch gar nicht mehr hinkommen ...

    das versteh ich nicht ganz

    hat da jemand einen tipp für mich 😞

    MfG
    Pascal

    Vermutlich weil es ein sog. Blocking Call ist. Das Programm wartet also bis der Befehl ausgeführt wurde. Das ist natürlich erst der Fall, wenn das Shutdown-Dialog fertig ist, also die Zeit um ist und der Computer herunterfährt. Du musst daher auf einen anderen Befehl ausweichen. Schau dir mal CreateProcess oder so an. Ich glaube, damit lässt sich das lösen.



  • Ich weis zwar nicht genau warum ... aber so funktionierts ^^

    ich hab festgestellt wenn ich das compilierte programm shutdown.exe benenne dann gehts nich ... wenn ich es aus.exe nenne gehts ... liegt vll daran weil es die shutdown.exe im system32 verzeichnis gibt ^^

    aber danke für deine bemühungen ...

    so gehts auf jedenfall 😃

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <conio.h>
    #include <ctype.h>
    
    int main(int argc, char** argv){
        char taste;
        char codetime[25];
        char *code;
        char codestring[]="shutdown -f -s -t ";
        int i;
    
        printf("Shutdown Programm");
        printf("\n\n [1]   Zeit festlegen bis der PC herunterfährt");
        printf("\n [2]   Herunterfahren abbrechen");
        printf("\n [ESC] Programm beenden ...");
    
        while (1) {
            if (kbhit()) {
                taste = getch();
    
                if (taste==27)
                    return(0);
    
                if(taste==49){
                    printf("\n\nBitte Zeit bis zum herunterfahren in Sekunden eingeben : ");
                            do{
                            gets(codetime);
    
                            if(strlen(codetime)<1){
                                system("cls");
                                printf("Bitte eine Zeit eingeben!!!");
                                printf("\n\nZeit in Sekunden : ");}
    
                            for(i=0;i<strlen(codetime);i++)
                                if (isdigit(codetime[i])){}else{break;};
    
                            if(i<strlen(codetime)){
                                system("cls");
                                printf("Bitte keine Buchstaben eingeben!!!");
                                printf("\n\nZeit in Sekunden : ");}
    
                            }while(strlen(codetime)<1||i<strlen(codetime));
    
                            code=(char*)malloc(sizeof(char)*(strlen(codestring)+strlen(codetime)));
                            strcpy(code, codestring);
                            code = strcat(code, codetime);
    
                            system(code);
                            return(0);
                }
    
                if(taste==50){
                    system("shutdown -a");
                }
            }
        }
        return(0);
    }
    


  • Deine Klammersetzung ist kacke



  • hmm ich bin offen für jede Kritik ...

    aber wenn du mir nicht sagst was daran kacke is weis ich auch nicht was besser wäre ⚠ 😉



  • hi

    Kake bleibt Kake.!

    mfg



  • anonymous_ schrieb:

    Kake bleibt Kake.!

    sehr wertvoller post 😃

    ein kleiner kritik punkt ist die inkonsitenz

    if (kbhit()) { 
    if(taste==49){
    

    die tendenz geht auch in die richtung

    if (taste == 49) { 
    statt
    if(taste==49){
    

    zu schreiben, da es besser lesbar ist,

    bei mir staucht sich das auch immer zusammen, auch wenn die leertaste so groß ist, drück ich sie doch recht selten 🙄 also bin ich der letzte der sich darüber aufregen darf.

    if (!isdigit(codetime[i])) {
      break;
    };
    statt
    if (isdigit(codetime[i])){}else{break;}; 
    
    printf("\n\nZeit in Sekunden : "); :warning: }
    

    wir sollten mal nen kleinen thread starten wo wir schön über sowas diskutieren können...

    lg lolo



  • joar stimmt ... die formatierung sieht so besser aus ...

    hab auch nur vergessen die autoformatierung zu drücken 😃

    das mit dem isdigit verneinen find ich gut ... wollt ich eig so machen wusste aber nicht vo ich das ! hinmachen soll ..

    dankeschön 😉


Anmelden zum Antworten