[python] Fork - problém s přístupem k rodičovské proměnné

Petr Messner petr.messner na gmail.com
Úterý Červen 30 13:05:17 CEST 2009


Ano, základem GUI v GTK (a i jinde) je smyčka - main event loop.
Mimochodem, tato smyčka se dá udělat i ručně, pomocí
gtk.events_pending() a gtk.main_iteration(block=True).

To mě vlastně přivedlo na myšlenku, můžeš si nastavit pravidelné
volání nějakého kódu a v něm si tu hlasitost z Alsy zjišťovat -
glib.timeout_add(interval, callback, ...). To už vypadá elegantně.
Samozřejmě že ten volaný kód (callback) nesmí trvat moc dlouho, jinak
bude GUI zamrzávat. Toto řešení mě mělo napadnout hned...

2009/6/30 Filip Bartmann <filbar na centrum.cz>:
> gtk.main() je co jsem prozatím ze zkoušení zjistil nekonečná smyčka a
> jakmile spustím gtk.main(), tak se už žádný další kód, který není
> vyvolán něcím v GUI nespustí, do ukončení gtk.main().
>
> Proto to zkouším řešit přes podprocesy/vlákna. A kdybych to hlavního
> procesu dal monitorování roury, tak bych to zase musel mít ve while
> True, ne?
>
> Jde to v Pythonu řešit nějak elegantněji?
>
> Děkuji.
>
> Dne Tue, 30 Jun 2009 12:05:02 +0200
> Petr Messner <petr.messner na gmail.com> napsal(a):
>
>> V půlce programu si to klidně forkneš a očekáváš, že z potomka si v
>> pohodě můžeš měnit proměnné v rodičkovském procesu, navíc z obou
>> procesů saháš do GTK? No fuj :-) GTK je myslím thread-safe (po nějaké
>> inicializaci, pokud si dobře vzpomínám), ale že by i
>> multiprocess-safe, to pochybuji :-)
>>
>> Doporučuji použít místo podprocesů vlákna nebo zařídit nějakou
>> meziprocesovou komunikaci - nejjednodušeji asi rouru/socketpair - tak
>> aby s GUI manipuloval jen jeden proces.
>>
>> PM
>>
>> 2009/6/30 Filip Bartmann <filbar na centrum.cz>:
>> > V této části kódu:
>> > ----------------------------------------------------------------------------------
>> > def __init__(self):
>> >                self.mixer=alsa.Mixer();
>> >                if self.mixer.getmute()[0]==0:
>> >                        self.icon=gtk.status_icon_new_from_stock(gtk.STOCK_YES);
>> >                else:
>> >                        self.icon=gtk.status_icon_new_from_stock(gtk.STOCK_NO);
>> >
>> >                pid=os.fork();
>> >                if pid==0:
>> >                        while True:
>> >                                mixer=alsa.Mixer();
>> >                                if mixer.getmute()[0]==0:
>> >                                        print "UNMUTED";
>> >                                        self.icon.set_from_stock(gtk.STOCK_YES);
>> >                                elif mixer.getmute()[0]==1:
>> >                                        print "MUTED";
>> >                                        self.icon.set_from_stock(gtk.STOCK_NO);
>> >                                time.sleep(1);
>> >
>> >                self.icon.connect("popup-menu",self.show_controls);
>> > ----------------------------------------------------------------------------------
>> >
>> > mám problém v přístupem k self.icon v potomkovi. Na CMDLině mi to
>> > sice správně hlási MUTED/UNMUTED ale ikona se nemění. Nevíte kde
>> > mám chybu?
>> >
>> > Za rady předem děkuji.
>> >
>> > Filip Bartmann
>> > _______________________________________________
>> > Python mailing list
>> > Python na py.cz
>> > http://www.py.cz/mailman/listinfo/python
>> >
>> _______________________________________________
>> Python mailing list
>> Python na py.cz
>> http://www.py.cz/mailman/listinfo/python
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python
>


Další informace o konferenci Python