martedì 13 febbraio 2007
Come segnalato in questo post, è stata da poco rilasciata la versione 7.5.441 di AVG Free, che risolve l'incompatibilità con Windows Vista a causa della quale in fase di avvio del sistema compariva il messaggio Could not initialize AVG antivirus kernel interface. Application cannot run. Rimangono comunque gli stessi problemi di cui avevo già parlato: il modulo che gestisce l'integrazione con Explorer e quello per la scansione della posta in entrata non funzionano correttamente. Solo eseguendo il programma come amministratore si ripristinano tutte le caratteristiche dell'antivirus. Di conseguenza, affinché l'antivirus venga eseguito correttamente è necessario passare ancora per l'Utilità di pianificazione, anche se adesso non è più necessario impostare un ritardo per l'esecuzione
(maggiori informazioni qui).
Windows Vista offre diverse opzioni quando si deve interrompere la propria sessione di lavoro, come è possibile vedere qui sotto:
Tutte queste modalità di spegnimento del computer possono causare un po' di confusione... Questo post cerca di fare un po' di chiarezza sull'argomento.
Abbiamo una classe che dispone di un metodo Start il quale, una volta richiamato, esegue un'operazione piuttosto complessa in un thread separato. Quest'ultimo può generare alcuni eventi per notificare all'applicazione che utilizza tale classe il verificarsi di certe condizioni. In una situazione del genere, poiché gli eventi sono lanciati da un thread separato, se nell'handler dell'evento si vuole modificare qualche oggetto dell'interfaccia, bisogna usare il meccanismo di Invoke per avere un accesso thread-safe ai controlli. Così facendo, in pratica sono necessarie due routine per ogni evento che si vuole gestire.
Se si utilizza il .NET Framework 2.0, è possibile adottare una soluzione alternativa che permette di lanciare gli eventi direttamente nel thread che gestisce l'interfaccia utente, risparmiando quindi l'utilizzo di Invoke. Bisogna innanzi tutto strutturare la classe che contiene il thread nel modo seguente:
1 using System;
2 using System.Threading;
3 using System.ComponentModel;
4
5 public class Worker
6 {
7 private AsyncOperation operation;
8 private SendOrPostCallback callback;
9
10 public event EventHandler MyEvent;
11
12 public Worker()
13 {
14 callback = new SendOrPostCallback(Callback);
15 }
16
17 public void Start(object stateInfo)
18 {
19 operation = AsyncOperationManager.CreateOperation(null);
20 Thread t = new Thread(DoWork);
21 t.Start(stateInfo);
22 }
23
24 private void DoWork(object stateInfo)
25 {
26 for (int i = 0; i < 5; i++)
27 {
28 Thread.Sleep(1000);
29 operation.Post(callback, i);
30 }
31 }
32
33 private void Callback(object stateInfo)
34 {
35 //Questo metodo viene eseguito nel thread che gestisce l'interfaccia.
36 int value = (int)stateInfo;
37 if (MyEvent != null)
38 MyEvent(this, EventArgs.Empty);
39 }
40 }
Il suo funzionamento ruota intorno agli oggetti AsyncOperation e SendOrPostCallback. L'utilizzo di questa classe è semplice:
Worker w = new Worker();
w.MyEvent += new EventHandler(w_MyEvent);
w.Start(null);
//...
int i = 0;
void w_MyEvent(object sender, EventArgs e)
{
label1.Text = (++i).ToString(); //Corretto.
}
L'evento MyEvent viene generato nello stesso thread in cui gira l'interfaccia utente (righe 33-39), quindi nella sua routine di gestione è possibile modificare direttamente gli oggetti del form, senza incorrere nell'errore InvalidOperationException.
Mi permetto di dare un piccolo contributo alle mitiche leggi di Damiani sui bytes:
Chuck Norris ha contato fino ad infinito. Due volte.
Da ragazzo Chuck Norris si cimentò con il Pascal: il primo programmino che fece lo chiamo' "Matrix".
Chuck Norris ha ricevuto il nobel per la medicina dopo essere riuscito a clonare la pecora Dolly con Norton Ghost.
Tratte dal sito We Love Chuck Norris... Se non l'avete mai visitato, vi consiglio di farlo al più presto, è spettacolare 
Per impostazioni predefinita di Windows Vista, il pulsante di alimentazione del menu Start (a destra della casella di ricerca) salva la sessione corrente e imposta la modalità a basso consumo, grazie alla quale è possibile riprendere il lavoro in pochi secondi. E' possibile cambiare il comportamento di questo pulsante agendo sulle Opzioni risparmio energia del Pannello di controllo. Fare clic sul link Modifica impostazioni combinazione corrispondente alla combinazione per il risparmio energia corrente, quindi fare clic su Cambia impostazioni avanzate risparmio energia. A questo punto raggiungere l'opzione visibile in figura:
Al posto di Sospensione è possibile specificare Arresta il sistema oppure Iberna. Dopo aver selezionato l'opzione desiderata, facendo clic su OK o su Applica il pulsante di alimentazione del menu Start assumerà la funzione indicata.
Segnalo questo webcast per quanti sono interessati o anche solo incuriositi dal .NET Micro Framework, rilasciato proprio oggi:
In this webcast, we describe how the .NET Micro Framework brings managed code to smaller devices and includes a number of additional features and extensions intended specifically for more of these small, embedded devices. Discover how the integration of the .NET Micro Framework with Visual Studio supports emulation on the computer, in addition to building, deploying, and debugging on the device from within the integrated development environment (IDE). Learn how the .NET Micro Framework also supports UI development with a graphics model inspired by the Windows Presentation Foundation—all of this with a few hundred kilobytes of RAM and a low-end 32-bit processor.
Il webcast si è svolto l'8 novembre 2006, quindi registrandosi sul sito è possibile vedere la registrazione oppure scaricarla in formato WMV.
Nel post precedente ho parlato della localizzazione con il .NET Compact Framework. Tra le altre cose, nell'articolo citato si legge che
The .NET Compact Framework does not support the CurrentCulture and CurrentUICulture properties for a Thread, as culture settings are per-device and not per-thread.
In parole semplici, non è possibile utilizzare queste proprietà per fare in modo che il ResourceManager carichi automaticamente a runtime le risorse localizzate e, ad esempio, modifichi la lingua utilizzata dall'interfaccia in base alla selezione dell'utente.
Su CodeProject è stato pubblicato un interessante articolo che spiega come superare questa limitazione, proponendo un approccio che si ispira alla soluzione adottata dalla versione Full del Framework. L'esempio allegato, in C#, richiede il Windows Mobile 5.0 SDK per Pocket PC.
Anche il .NET Compact Framework, al pari della versione Full, offre il supporto per la localizzazione delle applicazioni. Naturalmente, in questo caso è disponibile un minor numero di risorse, come si può leggere in questa pagina.
Tra le tante novità di Windows Vista c'è anche il Centro PC portatile, un pannello di controllo attraverso cui è possibile gestire diverse proprietà del notebook:
Esso permette anche di impostare la combinazione per il risparmio di energia, scegliendo tra risparmio energia, bilanciato e prestazioni elevate. Questo sistema, tuttavia, ha un grave limite: non è in grado di modificare automaticamente il profilo in base alla presenza di alimentazione da rete elettrica. Considerando tutte le possibilità di configurazione disponibili nelle Opzioni risparmio energia del Pannello di controllo, mi chiedo perché non sia stata inserita anche questa funzionalità. Con Windows XP utilizzavo Power4Gear, che può modificare dinamicamente la combinazione, e davo per scontato che Windows Vista avesse un'opzione analoga...