Portál AbcLinuxu, 12. května 2025 07:02

Dotaz: perl - spuštění příkazu na pozadí a callback

Přemek Vyhnal avatar 16.8.2008 23:39 Přemek Vyhnal | skóre: 24 | blog: Toto není blog! | Dobřichovice
perl - spuštění příkazu na pozadí a callback
Přečteno: 527×
Odpovědět | Admin
Problém:

GTK program v perlu. po kliknutí na tlačítko se spustí funkce, které trvá dlouho než skončí a po jejím dokončení se provede nějaká akce.

Teď to vypadá nějak takthle:
sub on_button_click{
   &delat_neco_dlouhyho;
   &zobrazit_hotovo;
}
sub delat_neco_dlouhyho{
   sleep 20; &posunout_progressbar;
   sleep 20; &posunout_progressbar;
   sleep 20; &posunout_progressbar;
   sleep 20; &posunout_progressbar;
}
problém je v tom, že hlavní smyčka čeká na dokončení &on_button_click a nepřekresluje mezitím okno (vypadá jako kdyby zamrzlo)

chtělo by to to &delat_neco_dlouhyho spustit nějak na pozadí aby hlavní smyčka pokračovala, ale aby měl hlavní program možnost nějak zjistit jestli už je to hotový nebo to pořád pracuje. nebo aby zevnitř &delat_neco_dlouhyho šlo posílat něco zpátky do hlavního okna. (např. % průběhu)

Poradil by mi někdo jak na to? co nastudovat? stačí nějaká klíčová slova a já si to už najdu (nebo se znovu zeptam ;) )

Předem mnohokrát děkuji!
NO RAPTORS!
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

17.8.2008 18:01 qk_
Rozbalit Rozbalit vše Re: perl - spuštění příkazu na pozadí a callback
Odpovědět | | Sbalit | Link | Blokovat | Admin
no pokud chces neco takovyho, tak nevim jestli to ma primo gtk, ale v perlu muzes pouzit thready jako v ostatnich jazycich - http://search.cpan.org/~rgarcia/perl-5.10.0/pod/perlthrtut.pod
17.8.2008 18:02 qk_
Rozbalit Rozbalit vše Re: perl - spuštění příkazu na pozadí a callback
tak a jeden priklad s pouzitim primo gtk - http://www.perlmonks.org/?node_id=470661
Přemek Vyhnal avatar 17.8.2008 23:07 Přemek Vyhnal | skóre: 24 | blog: Toto není blog! | Dobřichovice
Rozbalit Rozbalit vše Re: perl - spuštění příkazu na pozadí a callback
diky! prostuduji a vyzkousim ;)
NO RAPTORS!
frEon avatar 17.8.2008 21:42 frEon | skóre: 40 | Praha
Rozbalit Rozbalit vše Re: perl - spuštění příkazu na pozadí a callback
Talking about music is like dancing to architecture.
17.8.2008 21:19 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: perl - spuštění příkazu na pozadí a callback
Odpovědět | | Sbalit | Link | Blokovat | Admin
bez threadov sa to dá riešiť fork a čakať na SIGCHLD
Přemek Vyhnal avatar 17.8.2008 23:06 Přemek Vyhnal | skóre: 24 | blog: Toto není blog! | Dobřichovice
Rozbalit Rozbalit vše Re: perl - spuštění příkazu na pozadí a callback
diky! ten SIGCHLD by moh bejt to co jsem hledal... s forkem uz jsem se o to nejak pokousel ale moc se nedarilo. zkusim to znova a lip ;)

jo, a jak na to kdybych chtel aby ten potomek posilal do toho hlavniho okna nejaky informace jako "ted delam to a to", "uz mam hotovo" nebo treba prubeh v procentech? narazil jsem na nejaky IPC::Open2. Je to dobrej napad? ;) neukazal by mi nekdo jak na to nebo co s tim? ;) nechci aby to nekdo programoval cely za me, staci nakopnout spravnym smerem ;)

moc dik!
NO RAPTORS!
18.8.2008 08:47 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: perl - spuštění příkazu na pozadí a callback
Perl Cookbook, kapitola "Process Management and Communication"
18.8.2008 08:52 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: perl - spuštění příkazu na pozadí a callback
k tomu IPC::Open2
Nápad je to plus/mínus dobrý. Pozrite si k tomu ešte: IO::Poll (resp IO::Select), IO::Pipe ... a príslušné stránky s napr "Advanced UNIX Programming"
Josef Kufner avatar 24.8.2008 21:05 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: perl - spuštění příkazu na pozadí a callback
Můžeš rozdělit program (binárku) na frontend a backend (dvě binárky). Backend bude čistě konzolová, neinteraktivní věc a spouštět jí z frontendu pomocí popen(). K zobrazení průběhu bude stačit parsovat co vypisuje na stdout, který frontend dostane stejně jakoby četl soubor (pozor na bufferování). Doporučuju backend spouštět z frontendu s parametrem (např. --backend), který mu řekne, že ho spustil frontend. To aby při samostatném spuštění backendu byl poslušně ticho a ohlašoval jen chyby. Kdežto v při spuštění z frontendu šly chyby a podobné výpisy na stdout místo stderr a v opravdu lehce parsovatelné formě.

Výhoda: Možnost lehce použít backend bez frontendu někde jinde.

Nevýhoda: Musíš udělat parser, který ale může být velmi jednoduchý. Backend by měl být trochu víc psaný jako samostatný program.
Hello world ! Segmentation fault (core dumped)
25.8.2008 13:46 toba
Rozbalit Rozbalit vše Re: perl - spuštění příkazu na pozadí a callback
Přesně takhle to dělám, ale při pársování výstupu musím chtě nechtě použít

while(Gtk2->events_pending) { Gtk2->main_iteration };

jinak to GUI nacas zamrzne tak jako tak. Vlakna se mi libi ale ne vsechna distra maji perl zkompilovany s jejich podporou.
Josef Kufner avatar 26.8.2008 00:42 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: perl - spuštění příkazu na pozadí a callback
Gtk main loop umí obsluhovat události na file descriptorech. Takže ti pak přímo gtk volá callback, když přijdou data. Kuk sem
Hello world ! Segmentation fault (core dumped)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.