Tout d'abord, avant de commencer ce tutoriel, j'aimerais vous souhaiter une très bonne année 2011 et que tous vos vœux soient réalisés.
Aller, au boulot? Avant de passer à la pratique, on va faire un petit peu de théorie.
Qu'est-ce que le développement parallèle?
Est-ce des boutons que l'on aligne parfaitement? Non. Est-ce plusieurs actions que l'on exécute au même moment? On se rapproche. Est-ce une fonction que l'on exécute en même temps qu'une autre? Oui. Le développement parallèle est une façon de développé qui demeure aujourd'hui indispensable pour exécuter de gros calculs.
Pour être clair, le but du développement parallèle est d'exécuter une fonction dans un processus différent afin que le logiciel travail tout seul sans qu'il se fige. Ainsi votre logiciel pourra par exemple analyser tout le contenu d'un disque dur sans avoir à se demander si votre fenêtre va se figer ou pas.
Avantages :
- Gain en performance.
- Le processus s'exécute sur le deuxième processeur si l'ordinateur est équipé d'un CoreDuo.
- Le logiciel ne se fige pas durant l'exécution de la fonction.
- Très simple d'utilisation.
Désavantages :
- Gourmand en ressources.
- Accès restreint à l'interface de votre logiciel (nous verrons ça dans la pratique).
Utiliser le développement parallèle
Ça peut sembler un petit peu compliqué au début mais vous verrez qu'en réalité c'est très simple. Le système de développement parallèle est basé sur un composant utilisable dans un concepteur de fenêtre. La fonction qui s'exécutera en parallèle sera donc lié à un évènement de ce composant.
Aller, on commence? Dans SoftwareZator 2011, ouvrez une fenêtre dans le concepteur de fenêtre. Rendez-vous dans la Boîte à outils, et ajoutez un composant BackgroundWorker, qui se situe dans la catégorie Composants, à votre fenêtre. Celui-ci apparaîtra dans un encadré en bas de votre concepteur de fenêtre, car c'est un composant qui n'a pas d'interface visible à l'écran.
Propriétés
Une fois que votre BackgroundWorker est ajouté à votre concepteur de fenêtre, nous allons le configurer un petit peu. Pour cela, sélectionnez le BackgroundWorker que vous avez créé précédemment, puis passez dans le panneau Propriétés (par défaut, en bas à droite de la fenêtre de SoftwareZator).
Dans ce panneau, nous allons modifier deux propriétés :
- La première est WorkerReportsProgress. Elle permet d'indiquer qu'on autorise le BackgroundWorker à signaler la progression de la fonction. Mettez la valeur True (vrai).
- La seconde est WorkerSupportsCancellation. Cette propriété permet de déterminer si l'on peut demander à un BackgroundWorker de s'annuler (de s'arrêter) ou non. Mettez la valeur True (vrai).
Création d'une fonction
A présent que notre composant est configuré, on va s'attaquer à la création des fonctions. Toujours dans le concepteur de fenêtre, cliquez sur le bouton Lier ce contrôle à une fonction, situé dans le panneau latéral placé en bas du concepteur. Un assistant s'ouvre alors et vous demande de sélectionner d'un des évènements proposés pour continuer.
- DoWork : la fonction lié à cet évènement est la fameuse fonction qui va s'exécuter en parallèle. C'est donc la fonction exécuté en "arrière-plan" qui ne figera plus votre fenêtre.
- Note : dans cette fonction, toutes les actions permettant de manipuler l'interface de votre logiciel ne fonctionneront pas. Pour se faire, utilisez une fonction lié à l'évènement ProgressChanged.
- ProgressChanged : cette fonction est exécuté lorsque vous décidez de faire changer la progression du BackgroundWorker. Cette fonction n'est pas exécuté en parallèle, c'est pourquoi elle vous donne la possibilité de modifier l'interface (tel qu'une Progressbar pour afficher la fameuse progression).
- RunWorkerCompleted : cet évènement se déclenche lorsque la fonction lié à l'évènement DoWork a finit d'être exécuté.
Nous allons ici sélectionner l'évènement DoWork. Continuez l'assistant pour créer la fonction lié à cet évènement.
C'est bon c'est fait? Parfait ! Maintenant, comment utiliser notre BackgroundWorker? C'est simple au point que cela se résume en quatre actions seulement (toutes dans la catégorie BackgroundWorker, dans l'éditeur de fonctions) :
- Démarrer un BackgroundWorker.
- Progression d'un BackgroundWorker.
- Déterminer si un BackgroundWorker est en cours d'exécution.
- Arrêter un BackgroundWorker.
C'est bien beau mais comment on les utilise? J'allais justement y venir. ;)
- Démarrer un BackgroundWorker : comme son nom l'indique, cette action permet de démarrer un BackgroundWorker. En outre elle permet de déclencher la fonction lié à l'évènement DoWork.
- Placez cette action dans une fonction qui s'exécute lors d'un clic sur un bouton par exemple. Ainsi lorsqu'on cliquera sur le fameux bouton, le BackgroundWorker s'exécutera.
- Progression d'un BackgroundWorker : cette action permet de reporter la progression de votre BackgroundWorker. Elle déclenche donc l'évènement ProgressChanged du composant. Cette action vous propose également de préciser un pourcentage de progression et une variable dans laquelle il faut l'enregistrer (facultatif).
- Note : vous pouvez utiliser cette action depuis la fonction lié à l'évènement DoWork, ou bien de toute autre fonction. Prenez soin de déterminer avant si le BackgroundWorker fonctionne via l'action Déterminer si un BackgroundWorker est en cours d'exécution, suivi d'une condition.
- Déterminer si un BackgroundWorker est en cours d'exécution : permet de récupérer une valeur indiquant si le BackgroundWorker spécifié est en cours de fonctionnement ou pas. En outre, cette action détermine si la fonction lié à l'évènement DoWork est entrain d'être exécuté ou non.
- La valeur retourné est True (vrai) si le composant fonctionne, et False (faux) si il ne fonctionne pas (cette valeur n'est pas du texte).
- Arrêter un BackgroundWorker : cette action permet de forcer à annuler/arrêter le fonctionnement du BackgroundWorker spécifié avant qu'il n'ai terminé son exécution.
Voila, ce tutoriel est terminé. Compliqué? Pas tant que ça. Si vous désirez avoir quelques précisions sur certains points n'hésitez pas à me le demander en commentaire.
Et bonne année 2011 ! :)