Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

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

0 views
Skip to first unread message

Filip Bartmann

unread,
Jun 30, 2009, 5:51:18 AM6/30/09
to pyt...@py.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

Petr Messner

unread,
Jun 30, 2009, 6:05:02 AM6/30/09
to Konference PyCZ
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 <fil...@centrum.cz>:

> _______________________________________________
> Python mailing list
> Pyt...@py.cz
> http://www.py.cz/mailman/listinfo/python
>

Filip Bartmann

unread,
Jun 30, 2009, 6:17:29 AM6/30/09
to pyt...@py.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.m...@gmail.com> napsal(a):

Petr Messner

unread,
Jun 30, 2009, 7:05:17 AM6/30/09
to Konference PyCZ
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 <fil...@centrum.cz>:

Filip Bartmann

unread,
Jun 30, 2009, 9:01:08 AM6/30/09
to pyt...@py.cz
Super to je ono.
Moc děkuji za radu.

Dne Tue, 30 Jun 2009 13:05:17 +0200

0 new messages