V této lekci sestrojíme aplikaci s počasím používající asynchronní volání. Informace o počasí budeme v tomto příkladu získávat z geonames.org a aplikace používá kódy ICAO pro určení místa v požadavku o počasí. Abyste si mohli napsat a spustit kód příkladu sami, budete potřebovat v počítači nainstalovaný editor pro psaní kódu, terminál a GNOME 3.0 nebo novější. V této lekci budeme postupovat následujícími částmi:
Plánování grafického uživatelského rozhraní
Asynchronní volání
Soubor s hlavním programem
Místní knihovna GeoNames
Autotools a ikony
Po přečtení této lekce byste měli na obrazovce dostat toto:
Strukturování aplikace v GNOME 3 znamená používat GTK+. Nejpodstatnější věc, kterou si musíte zapamatovat, je, že hlavní okno může obsahovat jen jeden widget. S tím musíte počítat při návrhu struktury (v tomto příkladu použijeme Gtk.Grid). Vhodným způsobem je vložit do hlavního okna tento box a všechny widgety umístit do něj. Když se podíváte na obrázek budoucí aplikace, je snadnější říci, jaké jsou mezi widgety vztahy. Například Gtk.Grid umisťuje vaše widgety vůči ostatním widgetům, takže od chvíle, kdy je na místě první widget, může být umístění dalších provedeno vůči ostatním widgetům v mřížce.
V mnoha programovacích jazycích běží všechny operace synchronně – řeknete programu, aby něco udělal a než se může pokračovat, bude se čekat, než to bude úplně hotové. To se ale nehodí pro grafické uživatelské rozhraní, protože celá aplikaci by zamrzla během toho, co by se čekalo na nějakou operaci. Zde pomůže asynchronní provádění. S asynchronními voláními nebude vaše GUI blokováno žádným požadavkem. Asynchronní volání učiní vaši aplikaci pružnější a lépe vybavenou na zpracování situací, kdy volání zabralo více času, než se počítalo, nebo se z nějakého důvodu zaseklo. Asynchronní volání lze použít například u V/V operací souborového systému a pro pomalejší výpočty na pozadí.
V tomto příkladu musíme získat data z geoname.org. Zatímco se tak bude dít, chceme aby zbytek programu pokračoval. Pokud bychom z geonames.org nedostali žádné informace kvůli problémům s připojením k Internetu a jednalo by se o synchronní aplikaci, nedostali bychom se nikdy do bodu, kdy je správně provedena naše funkce main_quit() a aplikaci by bylo nutné zabít z terminálu.