Bouton STOP et annulation d'un traitement en cours
5 réponses
J. Smith
Bonjour,
Je suis en train de coder une classe qui effectue des scans de ficheirs sur
le disque dur.
Cette classe possède une méthode StartSCAN qui effectue ce travail.
StartSCAN est appelée depuis une fenêtre, suite au clic sur un bouton
"Scan".
Or cette méthode prend beaucoup de temps.
Je souhaite donc :
- présenter en début de Scan un bouton "Stop" qui permet de stopper la
procédure de scan
- présenter sur la fenêtre appelante les noms des fichiers en cours de
scan
Si je m'en sors pas trop mal pour le deuxième aspect, je n'arrive pas à
savoir comment mettre en oeuvre le premier. J'ai cru comprendre qu'il
existait plusieurs méthodes pour gérer l'arrêt d'un traitement en cours.
Pourriez-vous me guider ?
Quelle est la manière la plus standard de gérer ce type de problématique ?
Auriez-vous des exemples (simples) ?
Ou à défaut, une description de la méthode à suivre ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Patrick Philippot
J. Smith wrote:
Je souhaite donc : - présenter en début de Scan un bouton "Stop" qui permet de stopper la procédure de scan
Bonjour,
Ce n'est pas bien compliqué à mettre en oeuvre. A priori, votre traitement est basé sur une boucle. Il vous suffit donc d'avoir dans votre classe une variable booléenne qui est à FALSE au départ du traitement et qui sera mise à TRUE par action sur le bouton Stop. Dans votre traitement, à chaque passe vous vérifiez l'état de ce flag et s'il est passé à TRUE, vous arrêtez le traitement proprement.
Ce raisonnement vaut également si vous démarrer le traitement en question sur thread séparé ce qui serait peut-être plus pratique si les opérations prennent vraiment beaucoup de temps.
-- Patrick Philippot - Microsoft MVP MainSoft Consulting Services www.mainsoft.fr
J. Smith wrote:
Je souhaite donc :
- présenter en début de Scan un bouton "Stop" qui permet de
stopper la procédure de scan
Bonjour,
Ce n'est pas bien compliqué à mettre en oeuvre. A priori, votre
traitement est basé sur une boucle. Il vous suffit donc d'avoir dans
votre classe une variable booléenne qui est à FALSE au départ du
traitement et qui sera mise à TRUE par action sur le bouton Stop. Dans
votre traitement, à chaque passe vous vérifiez l'état de ce flag et s'il
est passé à TRUE, vous arrêtez le traitement proprement.
Ce raisonnement vaut également si vous démarrer le traitement en
question sur thread séparé ce qui serait peut-être plus pratique si les
opérations prennent vraiment beaucoup de temps.
--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Je souhaite donc : - présenter en début de Scan un bouton "Stop" qui permet de stopper la procédure de scan
Bonjour,
Ce n'est pas bien compliqué à mettre en oeuvre. A priori, votre traitement est basé sur une boucle. Il vous suffit donc d'avoir dans votre classe une variable booléenne qui est à FALSE au départ du traitement et qui sera mise à TRUE par action sur le bouton Stop. Dans votre traitement, à chaque passe vous vérifiez l'état de ce flag et s'il est passé à TRUE, vous arrêtez le traitement proprement.
Ce raisonnement vaut également si vous démarrer le traitement en question sur thread séparé ce qui serait peut-être plus pratique si les opérations prennent vraiment beaucoup de temps.
-- Patrick Philippot - Microsoft MVP MainSoft Consulting Services www.mainsoft.fr
J. Smith
Merci,
Mais cette façon de faire pose problème. Le traitement étant très gourmant, la fenêtre principale est surchargée et n'a plus assez de temps pour accepter et gérer les évènements sur les boutons. Aussi est-il impossible de cliquer sur le bouton Stop avant la fin du traitement.
"Patrick Philippot" a écrit dans le message de news:O7uaJ8f$
J. Smith wrote: > Je souhaite donc : > - présenter en début de Scan un bouton "Stop" qui permet de > stopper la procédure de scan
Bonjour,
Ce n'est pas bien compliqué à mettre en oeuvre. A priori, votre traitement est basé sur une boucle. Il vous suffit donc d'avoir dans votre classe une variable booléenne qui est à FALSE au départ du traitement et qui sera mise à TRUE par action sur le bouton Stop. Dans votre traitement, à chaque passe vous vérifiez l'état de ce flag et s'il est passé à TRUE, vous arrêtez le traitement proprement.
Ce raisonnement vaut également si vous démarrer le traitement en question sur thread séparé ce qui serait peut-être plus pratique si les opérations prennent vraiment beaucoup de temps.
-- Patrick Philippot - Microsoft MVP MainSoft Consulting Services www.mainsoft.fr
Merci,
Mais cette façon de faire pose problème.
Le traitement étant très gourmant, la fenêtre principale est surchargée et
n'a plus assez de temps pour accepter et gérer les évènements sur les
boutons. Aussi est-il impossible de cliquer sur le bouton Stop avant la fin
du traitement.
"Patrick Philippot" <patrick.philippot@mainsoft.xx.fr> a écrit dans le
message de news:O7uaJ8f$EHA.2076@TK2MSFTNGP15.phx.gbl...
J. Smith wrote:
> Je souhaite donc :
> - présenter en début de Scan un bouton "Stop" qui permet de
> stopper la procédure de scan
Bonjour,
Ce n'est pas bien compliqué à mettre en oeuvre. A priori, votre
traitement est basé sur une boucle. Il vous suffit donc d'avoir dans
votre classe une variable booléenne qui est à FALSE au départ du
traitement et qui sera mise à TRUE par action sur le bouton Stop. Dans
votre traitement, à chaque passe vous vérifiez l'état de ce flag et s'il
est passé à TRUE, vous arrêtez le traitement proprement.
Ce raisonnement vaut également si vous démarrer le traitement en
question sur thread séparé ce qui serait peut-être plus pratique si les
opérations prennent vraiment beaucoup de temps.
--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Mais cette façon de faire pose problème. Le traitement étant très gourmant, la fenêtre principale est surchargée et n'a plus assez de temps pour accepter et gérer les évènements sur les boutons. Aussi est-il impossible de cliquer sur le bouton Stop avant la fin du traitement.
"Patrick Philippot" a écrit dans le message de news:O7uaJ8f$
J. Smith wrote: > Je souhaite donc : > - présenter en début de Scan un bouton "Stop" qui permet de > stopper la procédure de scan
Bonjour,
Ce n'est pas bien compliqué à mettre en oeuvre. A priori, votre traitement est basé sur une boucle. Il vous suffit donc d'avoir dans votre classe une variable booléenne qui est à FALSE au départ du traitement et qui sera mise à TRUE par action sur le bouton Stop. Dans votre traitement, à chaque passe vous vérifiez l'état de ce flag et s'il est passé à TRUE, vous arrêtez le traitement proprement.
Ce raisonnement vaut également si vous démarrer le traitement en question sur thread séparé ce qui serait peut-être plus pratique si les opérations prennent vraiment beaucoup de temps.
-- Patrick Philippot - Microsoft MVP MainSoft Consulting Services www.mainsoft.fr
Pierre Alexis
J. Smith a écrit :
Je souhaite donc : - présenter sur la fenêtre appelante les noms des fichiers en cours de scan
Avec un évenement du genre "OnFileScanned" qui envoie à tous les abonnés le fichier que l'on est en train de scanner.
++
-- Pierre ALEXIS Courriel : FAQ Visual Basic : http://faq.vb.free.fr/
J. Smith a écrit :
Je souhaite donc :
- présenter sur la fenêtre appelante les noms des fichiers en cours de
scan
Avec un évenement du genre "OnFileScanned" qui envoie à tous les abonnés
le fichier que l'on est en train de scanner.
Je souhaite donc : - présenter sur la fenêtre appelante les noms des fichiers en cours de scan
Avec un évenement du genre "OnFileScanned" qui envoie à tous les abonnés le fichier que l'on est en train de scanner.
++
-- Pierre ALEXIS Courriel : FAQ Visual Basic : http://faq.vb.free.fr/
J. Smith
Merci
Dans le cas du thread, pouvez-vous m'indiquer les grandes lignes à suivre ? Je suis un peu perdu.
"Patrick Philippot" a écrit dans le message de news:OtsGbpg$
J. Smith wrote: > Mais cette façon de faire pose problème. > Le traitement étant très gourmant, la fenêtre principale est > surchargée et n'a plus assez de temps pour accepter et gérer les > évènements sur les boutons. Aussi est-il impossible de cliquer sur le > bouton Stop avant la fin du traitement.
C'est bien pourquoi j'ai proposé d'effectuer ce traitement sur un thread séparé.
Ou bien vous appelez dans votre boucle de traitement l'équivalent du DoEvents de VB6: Application.DoEvents() . Ce qui rendra la main temporairement et permettra de traiter les messages en attente pour la fenêtre principale.
-- Patrick Philippot - Microsoft MVP MainSoft Consulting Services www.mainsoft.fr
Merci
Dans le cas du thread, pouvez-vous m'indiquer les grandes lignes à suivre ?
Je suis un peu perdu.
"Patrick Philippot" <patrick.philippot@mainsoft.xx.fr> a écrit dans le
message de news:OtsGbpg$EHA.3988@TK2MSFTNGP11.phx.gbl...
J. Smith wrote:
> Mais cette façon de faire pose problème.
> Le traitement étant très gourmant, la fenêtre principale est
> surchargée et n'a plus assez de temps pour accepter et gérer les
> évènements sur les boutons. Aussi est-il impossible de cliquer sur le
> bouton Stop avant la fin du traitement.
C'est bien pourquoi j'ai proposé d'effectuer ce traitement sur un thread
séparé.
Ou bien vous appelez dans votre boucle de traitement l'équivalent du
DoEvents de VB6: Application.DoEvents() . Ce qui rendra la main
temporairement et permettra de traiter les messages en attente pour la
fenêtre principale.
--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Dans le cas du thread, pouvez-vous m'indiquer les grandes lignes à suivre ? Je suis un peu perdu.
"Patrick Philippot" a écrit dans le message de news:OtsGbpg$
J. Smith wrote: > Mais cette façon de faire pose problème. > Le traitement étant très gourmant, la fenêtre principale est > surchargée et n'a plus assez de temps pour accepter et gérer les > évènements sur les boutons. Aussi est-il impossible de cliquer sur le > bouton Stop avant la fin du traitement.
C'est bien pourquoi j'ai proposé d'effectuer ce traitement sur un thread séparé.
Ou bien vous appelez dans votre boucle de traitement l'équivalent du DoEvents de VB6: Application.DoEvents() . Ce qui rendra la main temporairement et permettra de traiter les messages en attente pour la fenêtre principale.
-- Patrick Philippot - Microsoft MVP MainSoft Consulting Services www.mainsoft.fr
Patrick Philippot
J. Smith wrote:
Dans le cas du thread, pouvez-vous m'indiquer les grandes lignes à suivre ? Je suis un peu perdu.
Bonjour,
L'explication du multithreading dépasse le cadre d'un newsgroup mais vous trouverez facilement des introductions à ce sujet en ligne: