Vivez le keynote de la PDC avec Bewise

28. octobre 2010

Si vous ne savez pas quoi faire ce soir, je vous propose de venir avec moi voir la retranscription simultanée du keynote de la PDC dans les locaux de Microsoft à Toulouse.

Toute la team Bewise sera là et on pourra discuter ensemble de toutes les annonces qui ne manqueront pas de voir le jour.

Pour s’inscrire c’est par là:

http://www.facebook.com/event.php?eid=125098587545246&index=1

L’adresse :
Microsoft - 1 Rue Marie Curie - Parc Technologique du Canal - 31520 Ramonville St-Agne

Windows Phone, .Net, Windows Forms, Windows Mobile, WPF, Visual Studio, Silverlight, DirectX, Bewise

BDC 2010 – C’est reparti!

4. mars 2010

A la demande générale, la Bewise Day Conference est de retour pour une 4ème édition ! Encore une fois, venez découvrir ce qui se fait de mieux dans les technologies Microsoft.

Cette année, beaucoup de nouveautés, puisque Microsoft lance la gamme 2010 de ses produits, notamment Visual Studio, Sharepoint, mais aussi la version 4.0 de son framework .Net, MVC 2, Azure, Silverlight 4 et bien d’autres choses bien croustillantes.

J’animerai les plénières cette année et je vous conseille d’y participer car vous y découvrirez le grand secret de Bewise :).

Pour les inscriptions, rendez-vous sur le site officiel de la BDC 2010.

Bewise, .Net, 3D, Silverlight, Visual Studio, Windows Forms, Windows Mobile, WPF

Le truc à la con du jour : plantage du Windows Form Designer de Visual Studio

17. novembre 2009

Un truc qui peut arriver et qui est bien gonflant : le plantage du Windows Form Designer.

Cela se produit souvent quand on a un contrôle qui hérite d’un autre ou un formulaire qui hérite d’un parent.

La solution (après des années de recherches et des financements de l’armée):

  • Allez dans le menu Tools/Options/Windows Form Designer
  • Mettre l’option AutoPopulateToolbox à faux
  • Lancer en ligne de commande de Visual Studio : mage –cc

Et le tour est joué!

Bon le rapport entre la toolbox et le biniou n’est pas claire mais tant que ça marche:)

.Net, Windows Forms

Les classes Timers de .NET

21. octobre 2009

Une question qui revient souvent concerne le fait qu’il y existe deux classes Timers dans le .NET : System.Windows.Forms.Timer et System.Timers.Timer.

Alors pourquoi me direz-vous? Et bien parce que ce ne sont pas les mêmes usages.

System.Windows.Forms.Timers

Ce timer se base sur un message Windows envoyé à l’application et qui sera donc traité par la boucle des messages et donc dans le thread de l’interface.

Avantage : Pas besoin de faire des Invoke pour accéder à l’interface puisque l’événement levé par le timer sera traité par le thread de l’interface.

Inconvénient : Le timer n’est pas précis car il passe par le système de messages de Windows. De plus il ne profite pas des multi-cpus du fait que tout est exécuté par un seul thread.

System.Timers.Timer

Ce timer se base sur des timers natifs (qui utilisent des threads).

Avantage : Très précis et gére bien les ressources mutli-cpus.

Inconvénient : Nécessite des Invoke pour accéder à l’interface.

.Net, Windows, Windows Forms

Le truc à la con du jour : Associer un designer par défaut à un type pour la PropertyGrid

18. juillet 2009

Le problème est le suivant : je voudrais mettre un TypeConverter et un designer par défaut sur un type donné sans pour autant aller me mettre les tags [TypeConverter] et [Editor] sur chaque propriété utilisant mon type.

Et comme souvent avec le framework .Net la solution est simple : Il est possible de référencer de manière statique ces attributs sur les types plutôt que sur les propriétés.

La solution en image:

            TypeDescriptor.AddAttributes(typeof(RGBAColor),
                new EditorAttribute(typeof(RGBAColorDesigner), typeof(UITypeEditor)),
                new TypeConverterAttribute(typeof(RGBATypeConverter))
                );

Ainsi on peut voir que j’associe directement un éditeur et un TypeConverter sur mon type RGBAColor.

Elle est pas belle la vie?

Windows Forms, .Net

Moteur 3D C# entièrement soft

10. juin 2009

Suite à une formation que je fais en interne chez Bewise, je vais déposer sur mon blog l’archive d’un petit moteur 3D entièrement en C# et surtout uniquement soft.

Donc ici pas de DirectX, que du calcul au CPU comme au temps de papy.

Suite aux évolutions que j’apporterai je reposterai les modifications.

Pour le moment le moteur gére:

  • Scéne/Objets/Faces
  • Textures
  • Rotation/Scaling/Translation

Le projet Visual Studio 2008 peut être téléchargé ici.

image

Windows, Windows Forms, 3D

Le truc à la con du jour : Comportement étrange du FileSystemWatcher

9. mai 2009

Dans le cadre de Nova, j’ai du utiliser le FileSystemWatcher pour tracer les modifications sur un fichier donné. Jusque là tout va bien me direz vous.

Toutefois, j’ai eu un comportement bien étrange : chaque fois que je modifiais le fichier surveillé je recevais deux événements Changed de la part du watcher.

Tel un docteur House de l’informatique, je me suis donc livré à un raisonnement différentiel (mon dieu que je me la pète).

Voici donc les symptômes:

  • Le double événement est systématique
  • Il peut parfois y en avoir trois
  • Si le NotifyFilter est sur Name ou Size, le problème disparait
  • Aucun bug ne semble connu sur le sujet
  • Si le fichier n’est pas sur mon bureau mais dans un répertoire d’un disque annexe, le problème disparait

A partir de cela j’ai finalement trouvé le coupable : Windows! En effet lors de la modification de mon fichier, Windows lance ce cher indexeur et ajoute donc une notification. Si en plus j’ai un anti-virus actif c’est coup triple.

C’est le fait que sur un disque annexe je n’ai pas le problème qui m’a mit la puce à l’oreille. En effet, Windows est configuré pour n’indexer que mon profil et pas des répertoires extérieurs.

Connaissant le coupable, le traitement est relativement simple. Je me suis fait une petite variable de type DateTime qui stocke la date de dernière modification de mon fichier. Si cette valeur est égale à la LastAccessTime de mon fichier je ne fais rien sinon je lance mon code:

            DateTime previous = lastAccessedDates[sender as FileSystemWatcher];
            FileInfo fileInfo = new FileInfo(e.FullPath);

            if (fileInfo.LastAccessTime > previous)
            {
                lastAccessedDates[sender as FileSystemWatcher] = fileInfo.LastAccessTime;
               // Code de traitement
            }

Windows Forms, .Net

Le truc à la con du jour : BackgroundWorker et Control.Invoke

10. avril 2009

Afin de remplir une liste de manière asynchrone j’ai fais appel au BackgroundWorker.

Ce dernier me permet d’avoir un événement asynchrone bien pratique.

Pour le lancer j’utilise ce bout de code:

       private void RefreshList()
        {
            while (backgroundWorker.IsBusy)
            {
                backgroundWorker.CancelAsync();
                Thread.Sleep(0);
            }

            backgroundWorker.RunWorkerAsync(txtFilter.Text);
        }

Ce qui me permet d’appeler RefreshList aussi souvent que je veux même si l’ordre de refresh précédent n’est pas terminé.

Pour gérer le CancelAsync j’ai mis en place ce bout de code (dans le handler de l’événement BackgroundWorker.DoWork) :

            foreach (var cardResult in list)
            {
                ListViewItem item = new ListViewItem(cardResult.Name);

                if (backgroundWorker.CancellationPending)
                    break;

                lstList.Invoke(new Action(
                    delegate()
                    {
                        lstList.Items.Add(item);
                    }
                    ));
            }

Ainsi de manière asynchrone ma liste se remplit depuis une requête LinQ.

Tout aurait du marcher et pourtant ca n’a pas marché :).

En effet, comme je suis un garçon poli je ne touche pas aux données de mes contrôles depuis un autre thread d’ou mon appel à lstList.Invoke qui me permet d’effectuer mon code lié au contrôle sur le thread du-dit contrôle.

Or, lorsque je fais ma boucle d’attente avec mon Thread.Sleep(0) (qui permet de laisser les autres threads prendre la main) je bloque le thread de mon contrôle, ce qui fait que mon Invoke ne peut jamais se faire!

Donc, pour bien utiliser le BackgroundWorker et surtout pour bien gérer le Cancel, il ne faut pas utiliser Thread.Sleep mais bien Application.DoEvents qui va permettre à mon thread principal de voir arriver l’ordre d’Invoke et donc qui finalement libérera le thread du BackgroundWorker qui pourra de ce fait voir que CancellationPending est à vrai.

La boucle de gestion du cancel donne donc:

       private void RefreshList()
        {
            while (backgroundWorker.IsBusy)
            {
                backgroundWorker.CancelAsync();
                Application.DoEvents();
            }

            backgroundWorker.RunWorkerAsync(txtFilter.Text);
        }

Ouf :)

.Net, Windows Forms