Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: biggles001 18. 08. 2011, 11:15:48
-
Zdravím,
mám jeden probém s GTK: potřebuju během provádění jedné funkce počkat 2 vteřiny. Samozřejmě nemůžu použít funkci sleep(), protože se během ní nerefreshuje grafické rozhraní.
Nenašel jsem žádnou vyhovující funkci, nevíte někdo o vhodném řešení?
-
GTK jako takove neznam, ale tohle je podle me jen problem ohledne pohledu na vyvoj desktop aplikaci. Je nutne funkci na uspani pouzit v jinem vlakne, nez je to ktere se stara o vykreslovani a handlovani akci jako jsou kliky na tlacitka atd...
Tudiz je treba veskerou praci, ktera brzdi vykreslovani delat v jinem vlakne. Urcite na to GTK ma svoje nastroje.
-
GTK je systém widgetů. Obecnějšími záležitostmi (časovač, systém typů GObject, callbacky...) se zabývá knihovna GLib. Viz např. zde http://developer.gnome.org/pygobject/stable/glib-functions.html#function-glib--timeout-add
-
timeout_add znám, není to ale úplně optimální. Já potřebuju pouze program pozdržet na 2 sekundy. Touto funkcí zajistím volání jiné funkce v pravidelných intervalech. Určitě by to šlo takto udělat, ale program by se asi dost zkomplikoval.
-
timeout_add znám, není to ale úplně optimální. Já potřebuju pouze program pozdržet na 2 sekundy. Touto funkcí zajistím volání jiné funkce v pravidelných intervalech. Určitě by to šlo takto udělat, ale program by se asi dost zkomplikoval.
Natáhnout ruce a seknout pravítkem. Tohle se opravdu jinak nemá/nesmí dělat. Samozřejmě, že to lze udělat přímo, ale takový člověk by se měl spíš věnovat háčkování a programování se vyhnout.
-
Natáhnout ruce a seknout pravítkem. Tohle se opravdu jinak nemá/nesmí dělat. Samozřejmě, že to lze udělat přímo, ale takový člověk by se měl spíš věnovat háčkování a programování se vyhnout.
Ale to byl skutečně přínosný komentář! Hned víme co a jak.
Koukni ještě jednou na komentář od Mivasi, truth is out there. Práci co trvá dlouho musíš dělat jinde než v GUI vlákně (tedy v jiném vlákně, procesu, na jiném počítači atp..), pokud se rozhodneš pro nejběžnější možnost, jiné vlákno, mrkni na http://developer.gnome.org/gdk/stable/gdk-Threads.html - máš tam i příklady.
-
Já bych se zakládání nových vláken vyhnul, když to jde.
Důležité je všimnout si, že toto není funkce, která se doopravdy provádí dlouho (předpokládám). Pouze se v ní čeká, což se v event-driven programech řeší nějakým timerem.
Původní kód:
do_work1();
sleep(2);
do_work2();
změňte na:
do_work1();
timeout_add(2000, do_work2)
a zařiďte, ať do_work2() vrátí false, jestli správně chápu manuál tak to zajistí aby se funkce opětovně nevolala.
Toto neřeší váš problém? A nebo to je to řešení, které je příliš složité?
-
hledej v google "gtk extensible marshaler".
-
.........
Toto neřeší váš problém? A nebo to je to řešení, které je příliš složité?
Nad tím jsem už uvažoval, ale nepřišlo mi to moc optimální. Zkoušel jsem to zhruba takto, fungovalo mi to, ale moc se mi to nelíbilo. Proto jsem napsal sem, jestli neexistuje přímo nějaká funkce, která by to řešila elegantněji.
Asi ale nemám žádnou jinou rozumnější volbu (vlákna tam moc motat nechci).
-
.........
Toto neřeší váš problém? A nebo to je to řešení, které je příliš složité?
Nad tím jsem už uvažoval, ale nepřišlo mi to moc optimální. Zkoušel jsem to zhruba takto, fungovalo mi to, ale moc se mi to nelíbilo. Proto jsem napsal sem, jestli neexistuje přímo nějaká funkce, která by to řešila elegantněji.
Asi ale nemám žádnou jinou rozumnější volbu (vlákna tam moc motat nechci).
A proč se ti to nelíbilo? Je to jenom subjektivní dojem a nebo jsi narazil na nějaký problém v chování aplikace?
-
Fungovalo to bez problému, jen jsem doufal, že se najde nějaká funkce podobná sleep, abych to nemusel pomocí timeout_add dělit na 2 části. Mám vlastně jednu několikařádkovou funkci, kterou musím rozdělit na 2, což mi trochu vadí.
-
Fungovalo to bez problému, jen jsem doufal, že se najde nějaká funkce podobná sleep, abych to nemusel pomocí timeout_add dělit na 2 části. Mám vlastně jednu několikařádkovou funkci, kterou musím rozdělit na 2, což mi trochu vadí.
No, nevím. Ale pokud máš (předpokládám) jednovláknovou aplikaci a chceš aby v průběhu toho 2sec zpoždění reagovalo UI, asi nemáš jinou volbu než použít frontu událostí (což je vlastně timeout_add) - musíš se prostě dostat z vykonávané funkce ven aby se dostala ke slovu obsluha událostí a UI mohlo reagovat. Jestli to pomůže, můžeš přidat do volání parametry. Ale já bych to považoval ze velice elegantní řešení tvého problému, když nechceš jít do více vláknové App.
-
Asi jo, timeout_add funguje, tak to tak nechám, dík všem za rady