Re: [python] Fork - problém s přístupem k ro dičovské proměnné
Super to je ono. Moc děkuji za radu. Dne Tue, 30 Jun 2009 13:05:17 +0200 Petr Messner 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 : > > 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 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 : > >> > 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@py.cz > >> > http://www.py.cz/mailman/listinfo/python > >> > > >> ___ > >> Python mailing list > >> Python@py.cz > >> http://www.py.cz/mailman/listinfo/python > > ___ > > Python mailing list > > Python@py.cz > > http://www.py.cz/mailman/listinfo/python > > > ___ > Python mailing list > Python@py.cz > http://www.py.cz/mailman/listinfo/python ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] Fork - problém s přístupem k rodi čovské proměnné
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 : > 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 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 : >> > 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@py.cz >> > http://www.py.cz/mailman/listinfo/python >> > >> ___ >> Python mailing list >> Python@py.cz >> http://www.py.cz/mailman/listinfo/python > ___ > Python mailing list > Python@py.cz > http://www.py.cz/mailman/listinfo/python > ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] Fork - problém s přístupem k ro dičovské proměnné
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 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 : > > 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@py.cz > > http://www.py.cz/mailman/listinfo/python > > > ___ > Python mailing list > Python@py.cz > http://www.py.cz/mailman/listinfo/python ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] Fork - problém s přístupem k rodi čovské proměnné
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 : > 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@py.cz > http://www.py.cz/mailman/listinfo/python > ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
[python] Fork - problém s přístupem k ro dičovské proměnné
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@py.cz http://www.py.cz/mailman/listinfo/python