Příkazy (1) Příkazy (commands) slouží pro zjednodušení vyvolání jedné (stejné) funkce programu (pop-sané metodou) pomocí různých prostředků, např.: položka v menu (hlavním nebo kontextovém) tlačítko v nástrojové liště zkratkový povel (shortcut) Umožňují definovat akce na jednom místě pro-gramu a odkazovat se na ně prostřednictvím různých ovládacích prvků 22/05/2018
Příkazy (2) Poskytují také podporu pro automatické akti-vování, resp. deaktivování ovládacích prvků v závislosti na tom, zda jimi vyvolaná operace může, resp. nemůže být v daný okamžik pro-vedena Definice příkazů se provádí pomocí vlastnosti CommandBindings (definované na úrovni třídy UIElement), která sdružuje kolekci příkazů Jednotlivé příkazy jsou definovány elementem <CommandBinding> 22/05/2018
Příkazy (3) Třída CommandBinding nastavuje vazbu mezi příkazem (typu RoutedCommand) a ob-služnými metodami, které jej implementují Definuje: vlastnost Command: uchovává asociovaný příkaz události Executed a PreviewExecuted: nastávají v okamžiku, kdy asociovaný příkaz má být proveden události CanExecute a PreviewCanExecute: nastávají v době, kdy asociovaný příkaz testuje, zda mů-že být proveden 22/05/2018
Příkazy (4) WPF poskytuje sadu předdefinovaných pří-kazů, které se v aplikacích často používají Tyto předdefinované příkazy jsou popsány ja-ko statické vlastnosti tříd: ApplicationCommands: standardní aplikační příkazy: např.: New, Open, Save, Copy, Cut, Paste, Find NavigationCommands: příkazy používané pro navigaci v dokumentu např.: BrowseBack, BrowseForward, GotoPage, Refresh, Search, Zoom 22/05/2018
Příkazy (5) MediaCommands: EditingCommands: ComponentCommands: reprezentují akce pro ovládání mediálních aplikací např.: Play, Stop, Pause, Record, NextTrack, PreviousTrack, IncreaseVolume, Decrease- Volume EditingCommands: operace používané při editaci dokumentů např.: AlignLeft, AlignRight, IncreaseFont-Size, DecreaseFontSize, EnterLineBreak ComponentCommands: slouží pro přesouvání se mezi komponentami např.: MoveDown, MoveLeft, ScrollPageDown, ScrollPageUp 22/05/2018
Příkazy (6) Příklad definice příkazu: <Window.CommandBindings> <CommandBinding Command = ”ApplicationCommands.Copy” Executed = ”CopyCmd_Spusten” CanExecute = ”CopyCmd_LzeSpustit”/> </Window.CommandBindings> Definovaný příkaz lze přiřadit k ovládacímu prvku pomocí jeho vlastnosti Command: <MenuItem Header = ”Kopírovat” Command = ”ApplicationCommands.Copy”/> 22/05/2018
Příkazy (7) Poznámky: v kódu na pozadí je zapotřebí definovat metody zodpovědné za obsluhu událostí Executed a CanExecute při použití příkazů se také automaticky přiřadí standardní zkratková klávesa pro danou operaci (např. Ctrl+C) Kromě používání předdefinovaných příkazů je možné také v programu definovat příkazy vlastní: jedná se mimo jiné o možnost, jak definovat vlastní zkratkové klávesy 22/05/2018
Příkazy (8) Definice vlastního (uživatelského příkazu) se provádí pomocí statické datové položky urče-né pouze pro čtení typu RoutedCommand Třída RoutedCommand definuje vlastnosti (nastavitelné v době volání konstruktoru): InputGestures: kolekce objektů třídy InputGesture umožňuje zadat zkratkové klávesy Name: název příkazu OwnerType: typ třídy, ve které je příkaz registrovaný 22/05/2018
Práce se schránkou (1) Pro práci se schránkou (clipboard) poskytuje WPF (podobně jako Windows Forms) třídu Clipboard Třída Clipboard (pro WPF) je definována ve jmenném prostoru System.Windows Poskytuje obdobné statické metody pro ma-nipulaci se schránkou (clipboardem) jako v případě Windows Forms: Clear: vymaže obsah schránky 22/05/2018
Práce se schránkou (2) ContainsAudio, ContainsImage, ContainsFileDropList, ContainsText: udává, zda schránka obsahuje: data ve formátu WaveAudio bitmapu soubory text GetAudioStream, GetFileDropList, GetImage, GetText: vrací data ze schránky (audio, soubory, bitmapu, text) SetAudio, SetFileDropList, SetImage, SetText: předává data do schránky (audio, soubory, bitmapu, text) 22/05/2018
Multitasking Schopnost operačního systému mít spuštěno více programů současně Operační systém používá hardwarové hodiny a každému běžícímu procesu přiděluje tzv. časová kvanta Pokud jsou časová kvanta dostatečně malá (a počítač není přetížen velkým množstvím spuštěných programů), má uživatel pocit, že všechny programy pracují současně 22/05/2018
Multithreading (1) Schopnost programu (za příslušné podpory operačního systému) zavést „multitasking sám v sobě“ Program se může rozdělit na několik samo-statných výpočtových (prováděcích) vláken, tzv. threads Jednotlivým vláknům jsou pak opět přidělová-na časová kvanta a tím vzniká dojem, že tato vlákna pracují současně 22/05/2018
Multithreading (2) Dovoluje vyvolat funkci programu, ještě dří-ve než byla dokončena funkce předešlá Program (v operačním systému podporujícím multithreading) začíná pracovat hlavním (primárním) výpočtovým vláknem V rámci hlavního výpočtového vlákna mohou být vytvářena a spouštěna další výpočtová vlákna 22/05/2018
Třída Thread (1) Definována ve jmenném prostoru: System.Threading Umožňuje vytváření a řízení činnosti výpoč-tových vláken Vytvoření nového výpočtového vlákna lze provést prostřednictvím volání konstruktoru (třídy Thread) Volanému konstruktoru se jako parametr pře-dá delegát specifikující metodu, která obsa-huje příkazy, jež se budou v průběhu výpoč-tového vlákna provádět 22/05/2018
Třída Thread (2) Delegát specifikující vyvolávanou metodu je tvaru: public delegate void ThreadStart() public delegate void ParameterizedThreadStart(object obj) Zahájení činnosti výpočtového vlákna je mož-né následně provést pomocí volání metody Start: vlákno je spuštěno asynchronně, tj. jako nebloku-jící Vlastnosti: CurrentThread: vrací aktuálně běžící výpočtové vlákno 22/05/2018
Třída Thread (3) IsBackground: Name: Priority: udává, zda se jedná o výpočtové vlákno, které je na pozadí, tj. background výpočtové vlákno může být background (nezabraňuje ukončení procesu) nebo foreground v okamžiku, kdy jsou všechna výpočtová vlákna fore-ground (patřící k danému procesu) ukončena, dojde k ukončení celého procesu a všechna zbývající vlákna background zůstanou nedokončena Name: specifikuje jméno výpočtového vlákna Priority: udává prioritu vlákna (Lowest, BelowNormal, Normal, AboveNormal, Highest) 22/05/2018
Třída Thread (4) Metody: ThreadState: Abort: Join: specifikuje stav vlákna (např. Running, Stopped, Aborted, Background apod.) Metody: Abort: způsobí výjimku ThreadAbortException a za-hájí proces vedoucí k ukončení výpočtového vlákna výjimka ThreadAbortException může být za-chycena, ale na konci bloku catch je vyvolána znovu opětovnému vyvolání ThreadAbortException lze zabránit voláním metody ResetAbort Join: blokuje volající výpočtové vlákno, dokud dané výpoč-tové vlákno neskončí 22/05/2018
Třída Thread (5) ResetAbort: Sleep: Start: ruší požadavek na ukončení výpočtového vlákna Sleep: pozastaví provádění vlákna na specifikovaný počet milisekund Start: zahájí činnost dříve vytvořeného výpočtového vlákna dané vlákno se po vyvolání metody Start nachází ve stavu Running umožňuje předat objekt obsahující data, která mají být použita metodou spouštěnou v rámci výpočtového vlákna je-li vlákno dokončeno, nemůže být pomocí metody Start znovu restartováno 22/05/2018
Třída Thread (6) Poznámka: existují i metody Suspend a Resume pro do-časné pozastavení činnosti vlákna a pro opětovné pokračování v jeho činnosti tyto metody jsou však zastaralé (obsolete) a v bu-doucích verzích nebudou podporovány 22/05/2018
Příkaz lock (1) Označuje blok programu jako kritickou sekci Slouží k zabezpečení, že určitý blok programu proběhne bez přerušení jinými výpočtovými vlákny Příklad: private static object theLock = new object(); … public static void DoWork() { lock (theLock) { // kritická sekce } } 22/05/2018
Příkaz lock (2) Zaručuje, že výpočtové vlákno nevstoupí do kritické sekce v době, kdy se v ní nachází jiné výpočtové vlákno Objekt uvedený jako argument za klíčovým slovem lock: je použitý pro identifikaci zdrojů sdílených mezi více výpočtovými vlákny musí být viditelný všemi vlákny musí být referenčního datového typu by měl být chráněný proti vnějšímu přepsání (private) 22/05/2018
Příkaz lock (3) Příkaz lock představuje syntaktickou zkratku pro volání metod Enter a Exit statické třídy Monitor s použitím bloku try a finally Příklad: private static object theLock = new object(); … public static void DoWork() { Monitor.Enter(theLock); try { // kritická sekce } finally { Monitor.Exit(theLock); } } 22/05/2018
Multithreading a GUI (1) Výpočtové vlákno by nemělo přistupovat pří-mo k ovládacím prvkům uživatelského roz-hraní, které nebyly tímto vláknem vytvořeny Poznámka: přímý přístup z jiného výpočtového vlákna by neměl být proveden k žádnému objektu vytvo-řenému na základě třídy odvozené od třídy DispatcherObject (pokud není „zmrazen“) Přístup k ovládacím prvkům vytvořeným ji-ným výpočtovým vláknem by měl být realizo-ván pomocí vlastnosti Dispatcher 22/05/2018
Multithreading a GUI (2) Vlastnost Dispatcher (typu Dispatcher) je definována ve třídě DispatcherObject a vrací objekt dovolující zpřístupnit výpočtové vlákno, k němuž daný ovládací prvek náleží Přístup k ovládacímu prvku z jiného výpočto-vého vlákna se tedy provádí pomocí vlastnosti Dispatcher voláním metod: BeginInvoke: asynchronně spustí delegáta (současné výpočtové vlák-no není blokováno, dokud se delegát neprovede) ve vý-počtovém vláknu, jež daný ovládací prvek vytvořilo 22/05/2018
Multithreading a GUI (3) Invoke: synchronně spustí delegáta (současné výpočtové vlákno je blokováno, dokud se delegát neprovede) ve výpočto-vém vláknu, jež daný ovládací prvek vytvořilo Poznámka k Windows Forms: ovládací prvky ve Windows Forms obsahují meto-dy BeginInvoke a Invoke (definované ve tří-dě Contol) s podobným významem jako zmíně-né metody třídy Dispatcher ve WPF lze využít i: metodu EndInvoke: slouží k získání návratové hodnoty asynchronní operace vyvo-lané pomocí metody BeginInvoke 22/05/2018
Multithreading a GUI (4) vlastnost InvokeRequired: vrací hodnotu (typu bool) vyjadřující, zda při přístupu k ovlá-dacímu prvku je nutné použít metodu Invoke nebo metodu BeginInvoke dáno skutečností, že přístup je prováděn z jiného výpočtového vlákna, než je výpočtové vlákno, které vytvořilo daný ovládací prvek 22/05/2018
Třída BackgroundWorker (1) Definována ve jmenném prostoru System.ComponentModel Umožňuje asynchronně spustit operaci v samo-statném výpočtovém vláknu Vlastnosti: CancellationPending: udává, zda byl dán požadavek na ukončení činnosti vý-počtového vlákna IsBusy: informuje, zda výpočtové vlákno běží nebo nikoliv WorkerSupportsCancellation: specifikuje, zda výpočtové vlákno může být asynchron-ně zrušeno 22/05/2018
Třída BackgroundWorker (2) WorkerReportsProgress: zapíná (vypíná) podporu pro informování o postupu vý-počtu prováděném v samostatném výpočtovém vláknu je-li zapnuta (nastavena na hodnotu true), je možné volat metodu ReportProgress, která vyvolá událost ProgressChanged Metody: CancelAsync: požaduje zrušení zahájené operace ve výpočtovém vláknu nastaví vlastnost CancellationPending na true ReportProgress: vyvolá událost ProgressChanged 22/05/2018
Třída BackgroundWorker (3) RunWorkerAsync: provede asynchronní spuštění výpočtového vlákna vyvolá událost DoWork Události: DoWork: vyvolána metodou RunWorkerAsync umožňuje formou obslužné metody popsat operace, které budou prováděny samostatným výpočtovým vláknem ProgressChanged: vyvolána metodou ReportProgess dovoluje reagovat na postupné změny v průběhu výpočtu RunWorkerCompleted: nastává v okamžiku, kdy výpočtové vlákno dokončí svoji činnost 22/05/2018
Třída Registry (1) Definována ve jmenném prostoru: Microsoft.Win32 Poskytuje: objekty typu RegisterKey, které reprezentují kořenové klíče v registry statické metody pro zpřístupňování informací v re-gistry Poznámka: registry: registrační databáze operačního systému MS Windows uchovává nastavení systému a programů 22/05/2018
Třída Registry (2) Datové položky (odpovídají kořenovým klí-čům registry): ClassesRoot: definuje typy (třídy) dokumentů a vlastnosti spojené s těmito typy zpřístupňuje klíč HKEY_CLASSES_ROOT CurrentConfig: obsahuje informace týkající se hardwaru zpřístupňuje klíč HKEY_CURRENT_CONFIG CurrentUser: obsahuje informace o preferencích aktuálního uživatele zpřístupňuje klíč HKEY_CURRENT_USER 22/05/2018
Třída Registry (3) Metody: LocalMachine: GetValue: SetValue: obsahuje konfigurační informace počítače zpřístupňuje klíč HKEY_LOCAL_MACHINE Metody: GetValue: umožňuje načtení hodnoty se specifikovaným jménem v daném klíči SetValue: nastavuje hodnotu v registry 22/05/2018
Třída RegistryKey (1) Definována ve jmenném prostoru: Microsoft.Win32 Zpřístupňuje klíče a hodnoty uložené v registry Vlastnosti: Name: vrací jméno klíče v registry SubKeyCount: vrací počet podklíčů aktuálního klíče ValueCount: vrací počet hodnot v klíči 22/05/2018
Třída RegistryKey (2) Metody: Close: CreateSubKey: DeleteSubKey: uzavírá klíč a v případě, že jeho obsah byl modifikován, provádí zápis na disk CreateSubKey: vytváří nový podklíč nebo otevírá existující podklíč pro zápis DeleteSubKey: smaže specifikovaný podklíč DeleteSubKeyTree: vymaže daný podklíč včetně všech jeho podklíčů DeleteValue: vymaže specifikovanou hodnotu v klíči 22/05/2018
Třída RegistryKey (3) GetValue: GetValueNames: OpenSubKey: SetValue: vrací hodnotu uloženou pod daným jménem umožňuje vrátit implicitní hodnotu (pokud zadané jmé-no neexistuje) GetValueNames: vrací pole řetězců udávající všechna jména hodnot v klíči OpenSubKey: otevírá podklíč SetValue: nastavuje hodnotu, která bude uložena pod daným jmé-nem 22/05/2018