wieso "pausiert" fgets eine dauerschleife



  • Hallo Zusammen!

    Ich hab ein Problem mit meinem Programm bzw. mit fgets().

    Die Aufgabe von meinem Programm ist es (später) mit verschiedenen Befehlen (Unter-)programme zu Starten und zu Stoppen.
    z.B. Möchte ich meine Webcam mit der openCV library starten können. Dazu wird in einem Fenster das aktuelle Livebild der Kamera angezeigt. Dies soll mit dem Befehl "start video" funktionieren. Um den Live-View zu beenden soll der Befehl "stop video" verwendet werden.
    Mein Problem ist nun dass durch fgets(); meine dauerschleife bei jedem Aufruf pausiert bis ich enter drücke. Dadurch wird meine funktion video() aber nicht dauernd aufgerufen. Dies ist aber notwendig um ein Livebild (ständiges speichern eines bildes im puffer und dieses auf dem bildschirm ausgeben) darzustellen. Wenn ich nun eine dauerschleife um meine video() funktion rumbastel, dann hätte ich zwar mein livebild, aber ich könnte keine befehle mehr eingeben.
    Gibts ne gute alternative evtl zu fgets?

    Danke schon mal für die Hilfe!

    Hier mein Code

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    // überprüft welcher compiler verwendet wird
    #ifdef __unix__
       #define clrscr() printf("\x1B[2J")
    #elif __BORLANDC__ && __MSDOS__
       #include <conio.h>
    #elif __WIN32__ || _MSC_VER
       #define clrscr() system("cls")
    #else
       #define clrscr() printf("clrscr() – Fehler!!\n")
    #endif
    
    // länge des sel_com arrays
    #define MAX 30
    
    int main(void) {
       char sel_com[MAX]="\n\0";  // array für befehle  
       char com_buf[MAX]="\n\0"; // buffer um sel_com zurückzusetzen
       const char com1[]="start video\n\0"; //start video-mode
       const char com2[]="stop video\n\0"; // stoppt video-mode
       const char com_end[]="quit\n\0"; // schließt prog
       int com_status[3]={0,0,0};  // status-bits Commands
       int ex_prog=0;
    
       // main do-while schleife
    
       do {
            if (!strcmp(sel_com, com1)) {
               com_status[0]=1;
               strncpy(sel_com, com_buf, MAX);
            }
            else if (!strcmp(sel_com, com2)) {
               com_status[0]=0;
            }
            else if (!strcmp(sel_com, com_end)) {
               ex_prog=1;
               strncpy(sel_com, com_buf, MAX);
            }   
            clrscr();
            if (com_status[0]==1) {
              printf ("Video mode: ON\n");
    
    // video(); Hier soll später die Funktion von für mein Video stehen   
            }
            else {
              printf ("Video mode: OFF\n");
            }
            printf (" COMMAND: ");
        } while (ex_prog!=1 && fgets(sel_com, MAX, stdin));
        return EXIT_SUCCESS;
    }
    


  • Geht wahrscheinlich nur mit Threads. Das allerdings Systemunabhängig zu schreiben wird ein ziemliches gefrickel.. wobei ich davon ausgehe dass es eh kaum möglich ist die Funktion "video()" portabel zu implementieren. Von daher solltest du dich für eine Plattform entscheiden.

    Threads für Windows:
    http://msdn.microsoft.com/en-us/library/ms682453(VS.85).aspx

    Weitere Fragen (Threads betreffend) am besten ins jeweilige Forum posten (WinAPI usw.)



  • ok, danke schon mal dafür! Werd mich da mal einlesen...



  • Vielleicht reicht ja schon kbhit()

    Schau mal bei diesen Post http://www.c-plusplus.net/forum/p284396



  • DirkB schrieb:

    Vielleicht reicht ja schon kbhit()

    Schau mal bei diesen Post http://www.c-plusplus.net/forum/p284396

    Vielleicht, allerdings wird die Funktion video() selbst wahrscheinlich in irgendeiner Art blockieren, ansonsten steigt die CPU last bei diesem Programm auf 100%. Wenn man jetzt Sleeps einbaut stören die wahrscheinlich wieder die video() Funktion. Ausserdem verlässt man so eh die "Systemunabhängig-Schiene".
    Deshalb würde ich mal sagen dass Threads in jeder hinsicht am besten sind 😉



  • cooky451 schrieb:

    Ausserdem verlässt man so eh die "Systemunabhängig-Schiene".

    Hat man diese Schiene nicht sowieso mit dem video verlassen?



  • DirkB schrieb:

    cooky451 schrieb:

    Ausserdem verlässt man so eh die "Systemunabhängig-Schiene".

    Hat man diese Schiene nicht sowieso mit dem video verlassen?

    Ich kenne die "openCV library" zwar nicht, aber da er ja noch #define für verschiedene Systeme nutzt scheinbar nicht^^
    War ja aber auch gar nicht der springende Punkt 😃



  • cooky451 schrieb:

    Ich kenne die "openCV library" zwar nicht,..

    Dito. Ich habe das bislang mit DirectShow direkt gemacht. DirectShow startet allerings einen eigenen Thread, ich würde mich wundern, wenn die Bibiothek das anders machen würde (da sie unter Windows DirectShow wahrscheinlich nur kapselt).
    Gibt es denn einen Grund, dies mit der Konsole zu machen?

    Wenn du einen Dialog oder ein Fenster mit entsprechenden Buttons erstellst, verfallen auch die Texteingaben.



  • Also ich hab bisher noch nichts mit der WinAPI programmiert. Meistens nur Konsolenanwendungen oder auf Mikrocontrollerebene.

    Hier ein Link zur OpenCV Lib für die interessierten: http://opencv.willowgarage.com/wiki/

    Bei meinem Programm/Projekt handelt es sich eigentlich darum, dass die Kamera ein Objekt erfassen soll (mit entsprechender Mathematik, Mustererkennung etc.). Bewegt sich nun das Objekt auf dem Bild, wird die Vorrichtung auf der sich die Kamera befindet, über Aktoren nachjustiert - das Objekt soll sozusagen verfolgt werden können.
    Mir ist es als erstes einmal wichtig ein Bild herzubekommen und das Objekt zu verfolgen. Die Ansteuerung der Aktoren is dann wieder was anderes (und damit schon off-topic).
    Graphisches Menü ist daher eher schlecht, da später evtl. auch eine Stand-alone auf MC mit extra Speicher für Kamera oder Display folgen soll. Deswegen auch die Systemunabhängigkeit.
    Mal schauen was draus wird. Aber ich scheitere ja grad schon am einfachen Menü ^^.
    Trotzdem Danke schon mal für die vielen Antworten. Vielleicht muss ich auch umdenken und das ganze anders angehen.


Anmelden zum Antworten