Jak naprogramovat čekání v GTK?

Jak naprogramovat čekání v GTK?
« kdy: 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í?
« Poslední změna: 18. 08. 2011, 17:41:46 od Petr Krčmář »


mivasi

Re: čekání v GTK
« Odpověď #1 kdy: 18. 08. 2011, 17:19:59 »
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.

František B.

Re: Jak naprogramovat čekání v GTK?
« Odpověď #2 kdy: 18. 08. 2011, 19:03:10 »
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

Re: Jak naprogramovat čekání v GTK?
« Odpověď #3 kdy: 18. 08. 2011, 20:29:46 »
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.

mat

Re: Jak naprogramovat čekání v GTK?
« Odpověď #4 kdy: 18. 08. 2011, 20:48:38 »
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.


ava

Re: Jak naprogramovat čekání v GTK?
« Odpověď #5 kdy: 19. 08. 2011, 09:18:08 »
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.

mc

Re: Jak naprogramovat čekání v GTK?
« Odpověď #6 kdy: 19. 08. 2011, 11:24:15 »
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é?

Ivan

Re: Jak naprogramovat čekání v GTK?
« Odpověď #7 kdy: 19. 08. 2011, 12:03:48 »
hledej v google "gtk extensible marshaler".

Re: Jak naprogramovat čekání v GTK?
« Odpověď #8 kdy: 19. 08. 2011, 12:34:50 »
.........

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).

Re: Jak naprogramovat čekání v GTK?
« Odpověď #9 kdy: 19. 08. 2011, 12:41:27 »
.........

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?

Re: Jak naprogramovat čekání v GTK?
« Odpověď #10 kdy: 19. 08. 2011, 12:51:24 »
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í.

Re: Jak naprogramovat čekání v GTK?
« Odpověď #11 kdy: 19. 08. 2011, 12:56:45 »
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.

Re: Jak naprogramovat čekání v GTK?
« Odpověď #12 kdy: 19. 08. 2011, 13:54:05 »
Asi jo, timeout_add funguje, tak to tak nechám, dík všem za rady