La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Tips & Tricks Roberto Brunetti Marco Frontini

Presentazioni simili


Presentazione sul tema: "Tips & Tricks Roberto Brunetti Marco Frontini"— Transcript della presentazione:

1

2 Tips & Tricks Roberto Brunetti Marco Frontini

3 Architettura Mai scrivere il codice nel Click !!!!!!!!Mai scrivere il codice nel Click !!!!!!!! Dopo i controlli sullinterfaccia specificaDopo i controlli sullinterfaccia specifica Chiamare una classe che esegue il lavoroChiamare una classe che esegue il lavoro Occhio al numero di oggetti caricatiOcchio al numero di oggetti caricati Non usare GC.Collect()Non usare GC.Collect() Implementare IDisposable dalle classi che fanno uso di altre risorseImplementare IDisposable dalle classi che fanno uso di altre risorse Usare.Dispose() dal chiamante (o using)Usare.Dispose() dal chiamante (o using) Come si fa per Connection al db, File etc etcCome si fa per Connection al db, File etc etc

4 try try { File.Open() File.Open() } catch (FileNotFoundException e) catch (FileNotFoundException e) { MessageBox.Show(Casino sul file); MessageBox.Show(Casino sul file); } finally finally { File.Close File.Close } Uso Corretto try/catch Usare try/finally allinterno di try/catch:Usare try/finally allinterno di try/catch: try try { { File.Open() File.Open() } finally finally { File.Close File.Close } } catch (FileNotFoundException e) { catch (FileNotFoundException e) { MessageBox.Show(Casino sul file); MessageBox.Show(Casino sul file); }

5 Close / Minimize I form si minimizzano (X)I form si minimizzano (X) Come le applicazioni CECome le applicazioni CE Share Violation da VS mentre copia dellexeShare Violation da VS mentre copia dellexe Molte utility intercettano la X per chiudere effetttivamente lapplicazione (form)Molte utility intercettano la X per chiudere effetttivamente lapplicazione (form) PocketPlus / Pocket ControllerPocketPlus / Pocket Controller Restando in memoriaRestando in memoria MinimizeBox = falseMinimizeBox = false Mette OK nella ControlBoxMette OK nella ControlBox Chiude la formChiude la form Non Logo-Compliant !Non Logo-Compliant !

6 Stop Close Per applicazioni sempre attive e bloccantiPer applicazioni sempre attive e bloccanti Intercettare Form.ClosingIntercettare Form.Closing (System.ComponentModel.CancelEventArgs e)(System.ComponentModel.CancelEventArgs e) e.Cancel = true;e.Cancel = true; Occorre MinimizeBox = falseOccorre MinimizeBox = false Deve chiudersi non minimizzarsiDeve chiudersi non minimizzarsi

7 UI lenta Il disegno dei bit sullo schermo non e velocissimoIl disegno dei bit sullo schermo non e velocissimo Per riempire i controlli con molti datiPer riempire i controlli con molti dati Visibile = FalseVisibile = False CicloCiclo Visible = TrueVisible = True Usare BeginUpdate / EndUpdate se supportatiUsare BeginUpdate / EndUpdate se supportati Demo FillingComboVBRichClientDemo FillingComboVBRichClient (HighResolutionTimer)(HighResolutionTimer)

8 Form Load Sempre Lento !Sempre Lento ! ObiettivoObiettivo Prima voltaPrima volta Ridurre il tempo di caricamentoRidurre il tempo di caricamento Successive volteSuccessive volte Azzerare il tempoAzzerare il tempo

9 Form Load first time (20% c.a.) VS.NET 2003VS.NET 2003 Costruttore chiama InitializeComponentCostruttore chiama InitializeComponent InitializeComponentInitializeComponent Controlli Quadrati (Panel, Tab, Form)Controlli Quadrati (Panel, Tab, Form) Sostituire con this.xxx.Bound = new Rectangle())Sostituire con this.xxx.Bound = new Rectangle()) GerarchiaGerarchia Usare figlio.Parent al posto di Papà.AddUsare figlio.Parent al posto di Papà.Add E Top Down: prima il papà e poi il figlioE Top Down: prima il papà e poi il figlio Occhio che il Designer rigenera sempre tuttoOcchio che il Designer rigenera sempre tutto Agire subito prima del deployAgire subito prima del deploy Fare classe Finta che blocca il designerFare classe Finta che blocca il designer Tenere due formTenere due form Su quella Auto fare modifiche e ricopiare il VeraSu quella Auto fare modifiche e ricopiare il Vera

10 Form ReLoad Form ReLoad Form di dettaglio da aprire più volteForm di dettaglio da aprire più volte Definire static il costruttoreDefinire static il costruttore Che inizializza solo la prima volta la formChe inizializza solo la prima volta la form Definire costruttore privatoDefinire costruttore privato In pratica si tiene in memoria la formIn pratica si tiene in memoria la form Meno costruzione/distruzione oggetti !Meno costruzione/distruzione oggetti ! Il GC non può scaricare la form se cè bisognoIl GC non può scaricare la form se cè bisogno Volendo si può precaricare da un background threadVolendo si può precaricare da un background thread Al termine del Load della prima formAl termine del Load della prima form

11 Collection di form Mettere le istanze dei form in collectionMettere le istanze dei form in collection Array – Collection Custom – etc...Array – Collection Custom – etc... Si possono precaricare allinizio in backgroundSi possono precaricare allinizio in background Fra un attimo parliamo di threadFra un attimo parliamo di thread Si possono caricare alla prima richiestaSi possono caricare alla prima richiesta Occhio alla quantità di memoria occupataOcchio alla quantità di memoria occupata Se troppa il GC potrebbe scaricare il codice compilatoSe troppa il GC potrebbe scaricare il codice compilato

12 Form non-full screen FormBorderStyle = NoneFormBorderStyle = None ObbligatorioObbligatorio Altri valori fanno tornare il form full screen a runtimeAltri valori fanno tornare il form full screen a runtime Ma ci perdiamo il bordo !!!Ma ci perdiamo il bordo !!! Override del metodo PaintOverride del metodo Paint Disegnare noi il bordoDisegnare noi il bordo Più semplice di quanto si credaPiù semplice di quanto si creda

13 Forms Full-Screen & Controls ManagedManaged Text =Text = Menu = null/NothingMenu = null/Nothing …e se serve linput panel o il menu?…e se serve linput panel o il menu? Native – SHFullScreenNative – SHFullScreen …e se lutente usa lhelp dellinput panel?…e se lutente usa lhelp dellinput panel? Managed OnDeactivate()Managed OnDeactivate() Native GetForegroundWindowNative GetForegroundWindow Non dimentichiamoci uno shortcutNon dimentichiamoci uno shortcut Per chiudere in caso di manutenzione (magari con password)Per chiudere in caso di manutenzione (magari con password) Task List: come visualizzare una sola formTask List: come visualizzare una sola form

14 Scrollable Something System.Windows.Forms.ScrollableControl è una fintaSystem.Windows.Forms.ScrollableControl è una finta ManagedManaged Panel come container dei child ControlsPanel come container dei child Controls NativeNative ScrollWindowEx + SW_SCROLLCHILDRENScrollWindowEx + SW_SCROLLCHILDREN E con la Second EditionE con la Second Edition … ancora peggio…… ancora peggio… Custom ControlCustom Control Il designer di VS 2003 non li supportaIl designer di VS 2003 non li supporta Nessun problema, lo inganniamoNessun problema, lo inganniamo

15 Funzionalità dei Device OrientamentoOrientamento RisoluzioneRisoluzione Display e Layout.NET Compact Framework 1.0 Service Pack 2 (oggi).NET Compact Framework 1.0 Service Pack 2 (oggi) Gestione automatica delle form scrollabiliGestione automatica delle form scrollabili Evento Form.ResizeEvento Form.Resize Gestione automatica dellalta risoluzioneGestione automatica dellalta risoluzione White paper su MSDN: Developing Screen Orientation-Aware ApplicationsWhite paper su MSDN: Developing Screen Orientation-Aware Applications Developing Screen Orientation-Aware Applications Developing Screen Orientation-Aware Applications

16 Display And Layout.NET Compact Framework 2.0 Supporto allorientamentoSupporto allorientamento Docking e AnchoringDocking e Anchoring Proprietà AutoScroll – forms, panelsProprietà AutoScroll – forms, panels Metodi Suspend/Resume LayoutMetodi Suspend/Resume Layout Metodo ChangeOrientationMetodo ChangeOrientation Supporto alla risoluzioneSupporto alla risoluzione Scaling automaticoScaling automatico Demo dopo con FabioDemo dopo con Fabio

17 SIP Display automatico su campo inputDisplay automatico su campo input Controllo da codiceControllo da codice Aggiungere il controllo Software Input PanelAggiungere il controllo Software Input Panel SIP.Enabled = true/falseSIP.Enabled = true/false Resize del form/controlliResize del form/controlli Intercettare EnableChangedIntercettare EnableChanged Proprietà VisibleDesktop di tipo RectagleProprietà VisibleDesktop di tipo Rectagle Height e Width per sapere la dimensioneHeight e Width per sapere la dimensione Ctor per salvare la dimensione originaleCtor per salvare la dimensione originale

18 Versione.NET CF Installata System.Environment.VersionSystem.Environment.Version Major / Minor / Revision / BuildMajor / Minor / Revision / Build N.B. I service Pack escono redistributableN.B. I service Pack escono redistributable Non aggiornano. Cab sotto VS 2003Non aggiornano. Cab sotto VS 2003 Si devono copiare i cab sullemulatoreSi devono copiare i cab sullemulatore VS 2005 non è più cosìVS 2005 non è più così Connessione con ActiveSync dellemulatore !Connessione con ActiveSync dellemulatore ! Da DesktopDa Desktop

19 App.Path MagariMagari OpenNETCFOpenNETCF ReflectionReflection Assembly.GetExecutingAssembly().GetName().CodeBaseAssembly.GetExecutingAssembly().GetName().CodeBase System.IOSystem.IO Path.GetDirectoryName per strappare lexePath.GetDirectoryName per strappare lexe

20 Registry P/Invoke ?P/Invoke ? OpenNETCFOpenNETCF Classe OpenNETCF.Win32.RegistryClasse OpenNETCF.Win32.Registry SottoClassi DedicateSottoClassi Dedicate ClassesRootClassesRoot CurrentUserCurrentUser LocalMachineLocalMachine UsersUsers CreateSubKeyCreateSubKey OpenSubKeyOpenSubKey DeleteSubkeyTreeDeleteSubkeyTree

21 File di Configurazione Da codice Namespace OpenNETCF.ConfigurationDa codice Namespace OpenNETCF.Configuration ConfigurtionSettings.AppSettings[nome]ConfigurtionSettings.AppSettings[nome] N.B. OpenNETCF 1.2N.B. OpenNETCF 1.2 Per applicazione Applicazione.exe.configPer applicazione Applicazione.exe.config Per DLL Applicazione.dll.configPer DLL Applicazione.dll.config Solo per primo livelloSolo per primo livello 1.3 Applicazione.exe.config1.3 Applicazione.exe.config

22 Threding in.NET CF

23 Semplice Intro Non usare il processore se non necessarioNon usare il processore se non necessario Non usare polling !!!!Non usare polling !!!! Soprattutto per sincronizzare i threadSoprattutto per sincronizzare i thread Il multithread aggiunge complessitàIl multithread aggiunge complessità Per definizione unapplicazione multithread non va più veloce...anziPer definizione unapplicazione multithread non va più veloce...anzi Ma più sfruttare momenti di pausaMa più sfruttare momenti di pausa Perché aspettare i dati da un DB invece di fare qualcosaltro nel frattempo ?Perché aspettare i dati da un DB invece di fare qualcosaltro nel frattempo ? Perché non eseguire operazioni in background mentre lutente fa altro ?Perché non eseguire operazioni in background mentre lutente fa altro ?

24 Threading Namespace.NET CF 1.0.NET CF 1.0 ThreadThread CurrentThreadCurrentThread PriorityPriority SleepSleep StartStart Foreground only !Foreground only !.NET CF 2.0.NET CF 2.0 ThreadThread CurrentThreadCurrentThread IsBackgroundIsBackground NameName PriorityPriority AbortAbort JoinJoin SleepSleep StartStart Fore e BackFore e Back

25 Thread.Creazione.NET Compact Framework 1.0.NET Compact Framework 1.0 Creare e avviare thread è sempliceCreare e avviare thread è semplice Thread myThread = new Thread(new ThreadStart(MyWorkerThread)); myThread.Start(); private void MyWorkerThread() { while (! workerThreadDone) { // simulate some processing Thread.Sleep(1000);}}

26 Thread.Creazione.NET Compact Framework 2.0.NET Compact Framework 2.0 Creare e avviare thread è più sempliceCreare e avviare thread è più semplice Thread myThread = new Thread(MyWorkerThread); myThread.Start(); private void MyWorkerThread() { while (! workerThreadDone) { // simulate some processing Thread.Sleep(1000);}}

27 Demo Considerazioni Abbiamo tre problemi nelle demo precedentiAbbiamo tre problemi nelle demo precedenti Usiamo la variabile iUsiamo la variabile i Se facciamo partire due thread andiamo in scrittura della stessa variabileSe facciamo partire due thread andiamo in scrittura della stessa variabile Lo abbiamo fatto solo per DemoLo abbiamo fatto solo per Demo Se chiudiamo la App con il thread in corsaSe chiudiamo la App con il thread in corsa La Form sembra si chiuda...fra pocoLa Form sembra si chiuda...fra poco Se abbiamo bisogno di aspettare il thread prima di fare altre operazioniSe abbiamo bisogno di aspettare il thread prima di fare altre operazioni Es Riempio Combo in parallelo ma prima di usarla il thread deve aver finitoEs Riempio Combo in parallelo ma prima di usarla il thread deve aver finito

28 Application Shutdown 1.0 solo Foreground Thread1.0 solo Foreground Thread Lapplicazione termina solo quando tutti i thread foreground finisconoLapplicazione termina solo quando tutti i thread foreground finiscono Sembra che si chiuda ma i thread avviati proseguonoSembra che si chiuda ma i thread avviati proseguono Evitiamo la chiusuraEvitiamo la chiusura Oppure potremmo stoppare il threadOppure potremmo stoppare il thread Ma in 1.0 non cè AbortMa in 1.0 non cè Abort Occorre usare una variabile - Polling ?!?!?!Occorre usare una variabile - Polling ?!?!?! OpenNETCF.ThreadingOpenNETCF.Threading ThreadExThreadEx MonitorEx, Semaphore, EventWaitHandleMonitorEx, Semaphore, EventWaitHandle

29 2.0 Abort Possiamo chiedere a un thread.AbortPossiamo chiedere a un thread.Abort Otteniamo uneccezione ThreadAbortExceptionOtteniamo uneccezione ThreadAbortException Non facciamo PollingNon facciamo Polling 2.0 anche Background Thread2.0 anche Background Thread Terminati dal CLR se lapplicazione terminaTerminati dal CLR se lapplicazione termina Thread.Abort chiamato dal CLRThread.Abort chiamato dal CLR Per Default sono ForeGroundPer Default sono ForeGround IsBackGround = true;IsBackGround = true;

30 Sapere quando ha finito 1.0 AutoResetEvent1.0 AutoResetEvent False prima di StartFalse prima di Start.Set() alla fine del lavoro del Thread.Set() alla fine del lavoro del Thread.WaitOne().WaitOne() 2.0 Join2.0 Join Nessun AutoResetEvent da dichiarareNessun AutoResetEvent da dichiarare Ne serve 1 per ogni thread (lavoro da fare)Ne serve 1 per ogni thread (lavoro da fare) Nessuna variabileNessuna variabile

31 Aggiornare UI da altri Thread Mai aggiornare i controlli direttamenteMai aggiornare i controlli direttamente private void WorkerThread() { statusBar1.Text = Sto facendo questo"; statusBar1.Text = Sto facendo questo"; while (!workerThreadDone) while (!workerThreadDone) { Thread.Sleep(1000); Thread.Sleep(1000); }}

32 1.0 Nessun eccezione...pizza e bastaNessun eccezione...pizza e basta Control.InvokeControl.Invoke Sincrono e senza parametriSincrono e senza parametri private string statusBarText; private void WorkerThread() { statusBarText = "WorkerThread active"; statusBarText = "WorkerThread active"; this.Invoke(new EventHandler(UpdateStatusBar)); this.Invoke(new EventHandler(UpdateStatusBar)); while (!workerThreadDone) while (!workerThreadDone) { Thread.Sleep(1000); Thread.Sleep(1000); }} private void UpdateStatusBar(object sender, EventArgs e) { statusBar1.Text = statusBarText; statusBar1.Text = statusBarText;}

33 2.0.NET CF 1.0.NET CF 1.0 Invoke (delegate)Invoke (delegate) N.B. 2.0N.B. 2.0 Eccezione se usato non correttamenteEccezione se usato non correttamente AsincronoAsincrono Parametri...non dobbiamo fare più variabiliParametri...non dobbiamo fare più variabili.NET CF 2.0.NET CF 2.0 Invoke (delegate)Invoke (delegate) Invoke (delegate, object[])Invoke (delegate, object[]) BeginInvoke (delegate)BeginInvoke (delegate) BeginInvoke (delegate, object[])BeginInvoke (delegate, object[]) EndInvoke ()EndInvoke () NotSupportedExceptionNotSupportedException

34 2.0 private void WorkerThread() { statusBar1.Text = Sto Facendo … calma"; statusBar1.Text = Sto Facendo … calma"; while (!workerThreadDone) while (!workerThreadDone) { Thread.Sleep(1000); Thread.Sleep(1000); }} NotSupportedException

35 2.0 Control.(Begin)InvokeControl.(Begin)Invoke private delegate void UpdateSB (string statusBarEntry); private void WorkerThread() { UpdateSB sbUpdater = UpdateStatusBar; UpdateSB sbUpdater = UpdateStatusBar; this.Invoke(sbUpdater, new object[] {"WorkerThread active"}); this.Invoke(sbUpdater, new object[] {"WorkerThread active"}); while (!workerThreadDone) while (!workerThreadDone) { Thread.Sleep(1000); Thread.Sleep(1000); }} private void UpdateStatusBar(string statusBarInfo) { statusBar1.Text = statusBarInfo; statusBar1.Text = statusBarInfo;}

36 Occhio alla chiusura !!! Foreground threadForeground thread Dispose del Form uccide i controlliDispose del Form uccide i controlli E il delegate fa la pizzaE il delegate fa la pizza == 1.0== 1.0 Background threadBackground thread Richiesto abort da CLRRichiesto abort da CLR Intercettare ThreadAbortException e fermare le invokeIntercettare ThreadAbortException e fermare le invoke Potrebbe essere comunque troppo tardiPotrebbe essere comunque troppo tardi Oppure evitare la chiusura come abbiamo vistoOppure evitare la chiusura come abbiamo visto

37 Non tutti sanno che … Retargetable flag attributeRetargetable flag attribute Typed DataSetsTyped DataSets HTTP ServerHTTP Server Migrazione da eMbedded Visual ToolsMigrazione da eMbedded Visual Tools ObfuscationObfuscation Compilazione da riga di comandoCompilazione da riga di comando Control Design – RuntimeAssemblyAttributeControl Design – RuntimeAssemblyAttribute String.Intern()String.Intern()

38 Design guidelines di Microsoft Pocket PC 2003 SDKPocket PC 2003 SDKPocket PC 2003 SDKPocket PC 2003 SDK SmartPhone 2003 SDKSmartPhone 2003 SDKSmartPhone 2003 SDKSmartPhone 2003 SDK

39 How To Custom TextBoxCustom TextBox managed o native ?managed o native ? Device IDDevice ID KernelIoControl() - IOCTL_HAL_GET_DEVICEIDKernelIoControl() - IOCTL_HAL_GET_DEVICEID WorkaroundWorkaround ToolbarToolbar ImageListImageList ListView con Second Edition e SP2ListView con Second Edition e SP2 DEMO #5DEMO #5

40 Fuori in 60 secondi Creare una gestione dati in 60 DataSoul Framework

41 © 2004 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. MICROSOFT MAKES NO WARRANTIES, EXPRESS OR IMPLIED, IN THIS SUMMARY. Content created by 3 Leaf Solutions


Scaricare ppt "Tips & Tricks Roberto Brunetti Marco Frontini"

Presentazioni simili


Annunci Google