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:
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. |
|
DejaVu |
» 2012-04-23 17:52:51 Poczytaj o programowaniu wielowątkowym - inaczej tego nie przejdziesz. |
|
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: void * stream_type( void * arg ) { struct Arguments * oArgs =( struct Arguments * ) arg; INFO( ">>>>>>>>>>>>>> %s", oArgs->strCommand ); pthread_exit( NULL ); }
Wywołanie: 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: 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. |
|
DejaVu |
» 2012-04-23 22:29:59 jedyne co Twój wątek robi to wyświetla tekst :) |
|
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. |
|
DejaVu |
» 2012-04-23 22:51:28 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 |
|
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...
|
|
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'. |
|
« 1 » |