Portál AbcLinuxu, 1. května 2025 01:40

Žirafa na Marsu!

30.4.2008 17:32 | Přečteno: 1240× | Dev/Tech/Gnu | poslední úprava: 30.4.2008 18:45

Tak jsem zase zapracoval na svém quick'n'dirty vyhledávači Žirafa, přitom bych měl dělat hromadu jiných věcí.

Novinky jsou tak neuvěřitelně zásadní, že jsem zvedl minor verzi, z 0.0.4 jsem šel rovnou na 0.1.0, tedy "skoro hotovo". Ne, vážně, teď už umí asi všechno, co jsem potřeboval.

Ikonky

Nalezené výsledky už nejsou jenom čistý text, ale u každého souboru se zobrazuje správná ikonka (tu dodá GNOME). Ve Windows zůstal čistý text.

Táhni a pusť

Žirafa uměla otevírat soubory poklepáním. To bylo pěkné, když člověk našel playlist a v XMMS se otevřelo celé album. Problém ale byl, když jsem chtěl do hrajícího XMMS přidat novou písničku - musel jsem ji najít v Krusaderu a přetáhnout. Teď už můžu do XMMS přetahovat přímo z výsledků Žirafy.

Vícevláknovost

Žirafa vyhledává rovnou během psaní dotazu. I když je to dost rychlé, přece jenom je to jednovláknová aplikace v Pythonu, takže během psaní dotazu přece jenom byly zřetelné lagy. Vzal jsem to jako výzvu a udělal vyhledávání v extra vláknu (aby neblokovalo GUI).

Pitomá dvě vlákna a já jsem se s tím docela natrápil. Ono totiž GTK má globální zámek, o který je potřeba se starat (gtk.gdk.threads_enter()/leave a tak). Je potřeba ho vzít v hlavním vláknu (před zavoláním gtk.main) a pak se o něj snažit, když šaháte na GUI z jiného vlákna. Zámek není rekurzivní, tudíž když se ho pokusíte vzít v jenom vláknu vícekrát, máte deadlock. Aby to nebylo moc jednoduché, tak Python má taky svůj globální zámek (GIL), jak to spolu souvisí jsem z dokumentace moc nepochopil. Naopak pomůže návod zde. Při snaze udělat to výkonné jsem vyrobil několik deadlocků a párkrát jsem core-dumpl celé GTK. Formální důkaz samozřejmě nemám, ale řekl bych, že teď to mám dobře.

Ke všemu jsem zjistil, že GTK port pro Windows má ty vlákna zkriplená - jakmile šáhnete na GUI z vedlejšího vlákna, tuháč. Tak jsem tam udělal fallback na singlethread - Windows jsou zde trpěná platforma, nikoliv podporovaná :-)

       

Hodnocení: 100 %

        špatnédobré        

Obrázky

Žirafa na Marsu!, obrázek 1 Žirafa na Marsu!, obrázek 2

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

Komentáře

Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

belisarivs avatar 30.4.2008 19:08 belisarivs | skóre: 22 | blog: Psychobláboly
Rozbalit Rozbalit vše Re: Žirafa na Marsu!
Odpovědět | Sbalit | Link | Blokovat | Admin
Vypada to fajn. Video jsem zkouknul. Ale ma to smysl pridavat si talsi indexovaci program k Trackeru?

Nebo je tenhle mene komplexni a tedy sviznejsi?
IRC is just multiplayer notepad.
30.4.2008 20:07 paskma | skóre: 13 | blog: Paskmův blog
Rozbalit Rozbalit vše Re: Žirafa na Marsu!
U mě to smysl má, protože tím indexuju MP3ky na externím disku, který občas odpojuju (a nevím, jak by to Trackerovi dělalo dobře). V podstatě to používám jako nadstavbu nad XMMS.

Je to malé, rychlé a napsané z hecu. Mně se to pro mé účely hodí. (Trackera používám taky.)

Něco o pohnutkách, které mě na Žirafu přivedly, jsem psal v prvním žirafím postu.
30.4.2008 20:07 Ladicek | skóre: 28 | blog: variace | Havlíčkův brod
Rozbalit Rozbalit vše Re: Žirafa na Marsu!
Odpovědět | Sbalit | Link | Blokovat | Admin
Žiju v dojmu, že jediné vlákno pro GUI je takový standard (v Javě se mu říká Event Dispatching Thread), dokonce jsem o tom svého času četl v knížce o Delphi. Čekal bych, že to budeš čekat :-)
Ještě na tom nejsem tak špatně, abych četl Viewegha.
30.4.2008 20:17 paskma | skóre: 13 | blog: Paskmův blog
Rozbalit Rozbalit vše Re: Žirafa na Marsu!
No to já vím. Jediný systém, co měl multithreaded gui byl prej BeOS.

Ďábel je samozřejmě v detailech, třeba tohle:
	def main(self):
		gtk.gdk.threads_enter()
		gtk.main()
		gtk.gdk.threads_leave()
Člověk by řekl, že hlavní vlákno ten globální GTK zámek nikdy nepustí, protože z gtk.main() to vyleze až po zavření okna. Jenže GTK event loop ten zámek čas od času pustí a nechá líznout ostatní vlákna. Tohle byl v podstatě hlavní kámen úrazu.

Založit nové vláknoNahoru

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