Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Funkcje system / popen blokują pracę programu

Ostatnio zmodyfikowano 2012-04-23 23:08
Autor Wiadomość
Kemsan
Temat założony przez niniejszego użytkownika
Funkcje system / popen blokują pracę programu
» 2012-04-23 16:41:58
Witam!
To znowu ja, wracając do tematu http://cpp0x.pl/forum/temat/?id=6981 postanowiłem wykorzystać funkcję system( ) do restreamingu pliku:
C/C++
strCommand = format( "avconv -loglevel 0 -v 0 -re -i %s -ar 44100 -acodec copy -s 1920x1080 -f flv rtmp://ip/live/%s_%s_1080p >/dev/null 2>&1", STR( _streamName ), STR( strStream ), STR( strPassword ) );
system( strCommand.c_str() );

Wszystko byłoby świetnie, gdyby nie fakt, że wywołanie tej komendy serwer stopuje działanie dalsze (czyli np, wywołanie jakiejkolwiek informacji, błędu etc.) i skupia się tylko i wyłącznie na tym poleceniu, fakt faktem, rozumiem, że "system" wywołuje funkcje, lecz funkcja ta powinna przejść przez program i tyle, gdyż sama linia funkcji zawiera magiczne przeniesienie output'a programu wywołanego do /dev/null, rozpoczęcie nowego procesu i pozwolenie na dalsze działanie programu. Tak się nie dzieje. Próbowałem z
pclose( popen( komenda, "r" ) );
 lecz wynik był ten sam. Nie mam już całkowicie pomysłów.
P-55080
DejaVu
» 2012-04-23 17:52:51
Poczytaj o programowaniu wielowątkowym - inaczej tego nie przejdziesz.
P-55088
Kemsan
Temat założony przez niniejszego użytkownika
» 2012-04-23 22:22:45
Skorzystałem z propozycji, choć nie wiem czy wykorzystuję ją w porządku - tworzę nowy wątek dla restreamingu (programu avconv):
Funkcja dla phtread:
C/C++
void * stream_type( void * arg )
{
    struct Arguments * oArgs =( struct Arguments * ) arg;
   
    INFO( ">>>>>>>>>>>>>> %s", oArgs->strCommand );
    pthread_exit( NULL );
}
Wywołanie:
C/C++
pthread_t mThread;
struct Arguments oArgs;

strCommand = format( "avconv -re -i %s -ar 44100 -acodec copy -s 640x360 -f flv rtmp://188.165.232.15/live/%s_%s_360p", STR( _streamName ), STR( strStream ), STR( strPassword ) );
oArgs.strCommand = strCommand.c_str();
pthread_create( & mThread, NULL, & stream_type, & oArgs );
Deklaracja w headerze:
C/C++
struct Arguments
{
    const char * strCommand;
};

void * stream_type( void * arg );

Jaki jest mój problem? Taki, że nadal program zatrzymuje się na tej funkcji, jeżeli wcześniej zatrzymywał się tylko na wykonaniu funkcji System lub Popen, teraz zatrzymuje się na wyświetleniu informacji - czyli użyciu wątku. Nie wiem jak to rozwiązać, nie proszę o kod, bo jak sami widzieliście po poprzednim temacie - wystarczyło mi podpowiedzieć, a rozwiązanie sam wymyśliłem, ale teraz boję się, że sam nie wymyślę wszystkiego. Z góry dziękuje za pomoc.
P-55140
DejaVu
» 2012-04-23 22:29:59
jedyne co Twój wątek robi to wyświetla tekst :)
P-55141
Kemsan
Temat założony przez niniejszego użytkownika
» 2012-04-23 22:32:36
Wiem, to służy tylko i wyłącznie do testu, ale tu błąd leży, że ten wątek nadal stopuje działanie programu - nie wyświetlają się inne, dalsze informacje, tylko ta jedna, ostatnia - ta z wątku, mogę zastąpić INFO na system i wyjdzie na to samo.
P-55142
DejaVu
» 2012-04-23 22:51:28
C/C++
void * stream_type( void * arg )
{
    printf( "thread is running\n" );
    Sleep( 1000 );
    printf( "thread is going to die...\n" );
    pthread_exit( NULL );
}

//...
printf( "Before thread running...\n" );
pthread_create( & mThread, NULL, & stream_type, & oArgs );
printf( "We can do sth else here...\n" );
Przetestuj :)

/edit:
Jeszcze pełny przykład jak coś masz tutaj:
http://www.kernel.org/doc/man-pages/online/pages/man3/pthread_create.3.html
P-55143
Kemsan
Temat założony przez niniejszego użytkownika
» 2012-04-23 23:04:27
Ah, już wiem, gdzie leży mój błąd - wywołuje INFO które wyświetla wiadomości w innym wątku, a wątek główny jest w tle więc nie widzę innych wiadomości. Dobrze myślę?
Takie wnioski wysunąłem ze względu na wynik wysłanego przez Ciebie kodu ( zmieniłem sleep na 5sek zamiast 1000 ;) ) :

Before thread running...
We can do sth else here...
thread is running
thread is going to die...
P-55144
DejaVu
» 2012-04-23 23:08:00
Wnioskiem powinien być fakt, że jak coś uruchomisz w threadzie to to się wykona i nie blokuje wątku głównego :) Myślę, że z resztą sobie już poradzisz skoro wiesz jak uruchomić sobie coś w 'tle'.
P-55145
« 1 »
  Strona 1 z 1