ruby-****@sourc*****
ruby-****@sourc*****
2005年 3月 24日 (木) 22:09:20 JST
------------------------- REMOTE_ADDR = 213.37.10.235 REMOTE_HOST = REMOTE_USER = ruby-gnome2-hiki URL = http://ruby-gnome2.sourceforge.jp/cgi-bin/hiki/es/hiki.cgi?tut-gst-threads ------------------------- TITLE = Hilos KEYWORD = = Hilos {{link("tut-gst-types", nil, "tut-gst", "tut-gst-queues")}} GStreamer tiene soporte para multithreading gracias al uso del objeto Gst::Thread. De hecho, este objeto es un Gst::Bin especial que se convierte en un nuevo hilo al iniciarse. Para construir un nuevo hilo actuamos de la siguiente forma: # crea el objeto thread thread = Gst::Thread.new # a$B(Bdimos algunos plugins thread.add(funky_src, cool_effect) # conectamos los elementos ... # comienza la reproducci$B(B thread.play El programa anterior crearun hilo con dos elementos dentro de $BqM(B. Tan pronto como su estado pase a Gst::Element::STATE_PLAYING, el hilo se iniciarpor si solo. Nunca es necesario iterar expl$ByD(Bitamente un hilo. == Constraints situadas en la tuber$ByB(B por el Gst::Thread Dentro de la tuber$ByB(B, todo transcurre igual que en cualquier otro contenedor. La diferencia reside en l$ByN(Bite de hilos, en la conexi$B(B entre el hilo y el mundo exterior (el contenedor). Ya que GStreamer es fundamentalmente orientado a buffers m$BaT(B que orientado a bytes, la soluci$B(B natural a este problema es un elemento que pueda realizar un buffer de los buffers de cada hilo (valga la redundancia), de un modo seguro ("thread-safe"). Este elemento es la cola (Gst::Queue), que se descibe en el cap$ByU(Bulo ((<Colas|tut-gst-queues>)). No importa que la cola forme parte del contenedor principal o del hilo mismo, pero es necesario que estpresente en al menos uno de los dos lados para permitir la intercomunicaci$B(B entre ambos. == $B?C(Bu$Ban(Bdo hay que usar hilos? Si se estescribiendo una aplicaci$Bsn(B con GUI, haciendo del contenedor principal un hilo se consigue que la GUI tenga mejor respuesta. Si en su lugar tenemos una tuber$Bma(B, esta deberser iterada por ciclo de eventos de tu aplicaci$Bsn(B, lo cual incrementa el tiempo entre eventos (presiones de tecla, por ejemplo) y la respuesta de la GUI. Adem$Bas(B, cualquier peque$Bqo(B retardo en el GUI retrasarla iteraci$Bsn(B de la tuber$Bma(B, que puede causar (por ejemplo) saltos en la salida por tarjeta de sonido, en el caso de una tuber$Bma(B de audio. Un hilo se puede visualizar de esta forma: {{image_left("thread.png")}} {{br}} Como ejemplo pr$Bac(Btico, puede leer el c$Bsd(Bigo fuente de nuestro ((<Simple Audio Player>)).