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

Filip Bartmann filbar na centrum.cz
Úterý Červen 30 15:01:08 CEST 2009


Super to je ono.
Moc děkuji za radu.

Dne Tue, 30 Jun 2009 13:05:17 +0200
Petr Messner <petr.messner na gmail.com> napsal(a):

> 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
> >
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python


Další informace o konferenci Python