begin process at 2012 02 07 10:35:22
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C#

 > 

Système

 > 

Exécution

 > 

[Threads] Stopper un thread via un control


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

[Threads] Stopper un thread via un control

jeudi 28 février 2008 à 17:34:44 | [Threads] Stopper un thread via un control

littlekenny

Salut,

M'étant  basé sur l'article de MorpionMx (Opérations cross-threads - utilisation des délégations synchrones / asynchrones), j'aimerais fermer mon thread secondaire (traitement qui peut devenir long et lourd) via un bouton ou popup lié à mon thread principal. Une fois mon thread secondaire lancé, mon interface principale est cependant bloquée jusqu'à la fin de l'exécution du thread secondaire (qu'il soit asynchrone ou pas, ça ne change rien).

// mon thread secondaire
private Thread
threadLoadReport=null;
...
//je lance mon thread secondaire à partir de la forme qui contient le bouton qui devrait être utilisé pour tuer (abord) ce thread.
threadLoadReport = new Thread(new ThreadStart(ExecuteThreadReport));
threadLoadReport.Priority = ThreadPriority.Highest;
threadLoadReport.Start();
...
private void ExecuteThreadReport()
        {
            IAsyncResult iar=this.BeginInvoke(new DelExecuteReport(ExecuteReport), lastReportOpened);
            //lancement de l'exécution lourde, contenue dans la procédure
ExecuteReport(string str)
            this.EndInvoke(iar);
        }
...
//le code derrière le bouton pour tuer mon thread secondaire est simple:
if (threadLoadReport != null)
            {
                threadLoadReport.Abort();
                threadLoadReport = null;
            }

Pour résumé, je ne comprends pas pourquoi mon interface principale est bloquée lorsque je lance mon thread secondaire. J'aimerais avoir la possibilité de garder la main sur celle-ci.

Un super grand merci d'avance, ça me dépannerait beaucoup.
jeudi 28 février 2008 à 18:30:19 | Re : [Threads] Stopper un thread via un control

lassaad83

Membre Club

Qu'est ce que tu fait exactement dans la méthode ExecuteReport(string str) ?

jeudi 28 février 2008 à 18:38:18 | Re : [Threads] Stopper un thread via un control

lassaad83

Membre Club

Rajoute un Thread.Sleep(0) au niveau ExecuteThreadReport()

jeudi 28 février 2008 à 19:25:16 | Re : [Threads] Stopper un thread via un control

MorpionMx

Membre Club Administrateur CodeS-SourceS
Salut,

Regarde les explications que je donne dans ce sujet, elles pourront peut etre t'aider

Mx
MVP C#
 

vendredi 29 février 2008 à 09:05:52 | Re : [Threads] Stopper un thread via un control

littlekenny

Merci pour vos réponses mais ça ne fonctionne pas :
> lassaad83 : ExecuteReport(string str) est ma procédure qui charge un crystal report dans un viewer.
En gros, j'ai ceci comme code dedans :
crystalReport.ReportSource = crReportDocument; où
crReportDocument est un rapport Crystal. Selon les paramètres introduits, le temps d'exécution est plus ou moins long (de 2 à 30sec).

> MorpionMx : J'ai essayé ce qui a été fait dans l'exemple mais ça ne fonctionne pas:

Dans votre exemple, il y a :

      for (int i = 0; i < 1000;  i++) //on boucle 
      {
         IAsyncResult ias = this.BeginInvoke(new monDelegate(MethodeTest), i.ToString()); //traitement léger
         Thread.Sleep(1000); //longue pause
         this.EndInvoke(ias);
      }

Pour mon cas, on a :

     ...
     threadLoadReport = new Thread(new ThreadStart(ExecuteThreadReport));
     threadLoadReport.IsBackground = true; // je l'ai rajouté
     threadLoadReport.Start();

    ...

private void ExecuteThreadReport()
{
   //pas de boucle
   IAsyncResult
iar = this.BeginInvoke(new DelExecuteReport(ExecuteReport), lastReportOpened); //traitement lourd
   Thread.Sleep(1000); //pause ridicule par rapport au traitement
   this.EndInvoke(iar);

}

En appuyant comme un forcené sur mon bouton stop, on dirait qu'il peut de temps en temps recevoir l'event click. A mon avis, ça correspond au temps de pause d'une seconde.

Est-ce que quelqu'un a une idée? Merci d'avance.

samedi 1 mars 2008 à 19:07:03 | Re : [Threads] Stopper un thread via un control

coq

Administrateur CodeS-SourceS
Salut,

Que fait tu après le lancement du thread ?
Le problème se pose t'il aussi si tu neutralises la génération du rapport et que tu la remplaces par une attente longue ?


/*
coq
MVP Visual C#
CoqBlog
*/
lundi 3 mars 2008 à 14:48:56 | Re : [Threads] Stopper un thread via un control

littlekenny

> coq : "Que fait tu après le lancement du thread ?" Pour l'instant, rien.
J'essaye, via un popup avec un bouton (lancé dans un autre thread), si le programme me redonne la main pendant le chargement (un peu comme la méthode annuler le chargement dans Toad). Rien de concluant pour l'instant.

"Le problème se pose t'il aussi si tu neutralises la génération du rapport et que tu la remplaces par une attente longue ?"
Si je remplace la génération du rapport par un sleep, ça fonctionne. Je me demande si le problème n'est pas lié à la méthode invoke. J'avais lu dans un de tes posts que cette méthode créait une instance de la procédure appelée dans le thread principal (si je ne me trompe pas). Mon problème vient peut-être de là.

Je vais encore tester ça. Si je trouve quelque chose, je le posterai tantôt.
De même, si vous avez des idées, n'hésitez pas à partager. Merci d'avance.

 

mardi 4 mars 2008 à 09:51:01 | Re : [Threads] Stopper un thread via un control

littlekenny

Réponse acceptée !
Je crois avoir trouvé une solution:

            private Thread threadLoadReport = null; //thread pour afficher mon rapport
            private Thread threadStop = null; //thread pour popup, pour arrêter threadLoadReport
...
            threadStop = new Thread(new ThreadStart(ExecuteThreadStop));
            threadStop.Name = "stop";
            threadStop.Start(); 
            threadLoadReport = new Thread(new ThreadStart(ExecuteThreadReport));
            threadLoadReport.Name= "Execute";
            threadLoadReport.Priority = ThreadPriority.Highest;
            threadLoadReport.IsBackground = true;
            threadLoadReport.Start();
...
private void ExecuteThreadStop()
        {
            frmStop = new FrmStop(); //mon popup qui va me servir à stopper le chargement de mon rapport (using to abord the thread threadLoadReport).
            frmStop.ShowDialog(); //j'utilise un showdialog et pas un show, sinon le popup disparait à la fin du thread (vu qu'ils sont liés)
        }

Comme vous pouvez le voir, je n'utilise pas d'invoke dans mon second thread (ExecuteThreadStop()), cela répond bien à ma question-réponse de mon post précédent sur la méthode invoke. Mon popup n'est ainsi pas lié au thread principal et est lancé via un autre thread. Le plus lourd du travail est fait, il ne me reste plus qu'à aborder le chargement du premier thread et c'est bon.

Merci pour vos aides.


Cette discussion est classée dans : bouton, thread, threads, secondaire, threadloadreport


Répondre à ce message

Sujets en rapport avec ce message

Les threads.... [ par Arthenius ] Salut tout le monde,j'ai une petite question concernant les threads....Voila le contexte, j'ai un objet herite d'un datagrid qui permet de charger des Problème de thread et event [ par zobio ] Voila, je cherche a lancer un thread secondaire à partir de mon thread principal, jusque la pas de soucis. Ensuite je voudrais que lorsque mon thread Questions sur les threads + Au Secours point d'exclamation [ par emmanuel9 ] Bonjour à tous, En faite ma question serait sur le threads : J'ai cette fonction ci qui me sert à afficher un listview et une progressbar, je l'ais Question réseau et multi thread [ par vbmore ] Salut !je suis en train de programmer un client server TCP/IP et je bute sur un probleme. En effet, pour avoir un systeme asynchro., je créer une nouv Gif + Thread [ par emmanuel9 ] Bonjour à tous, J'ai une application qui possède un bouton exporter et les traitement effectué lors de l'appui sur ce bouton gele l'appli pendant un t Thread.Abort() [ par nico4nicolas ] Bonjour, Pour la premiere fois, j'utilise les threads alors, pour me faire la main j'ai fait un petit programme pour voir comment ca fonctionne, j'ai clavier et bouton [ par Geometre15 ] Bonjour!Voici mon probleme : j'utilise un thread dans une fenetre. Ce thread me permet de détecter l'appui sur une touche, comme les fleches par exemp les threads 2005 sont extrement minimisé [ par Fildomen ] sltj'ai toujours des problèmes avec la version 2005, et + précisement avec les threads, voilà mon problème:j'ai une form qui appel un sub, et ce sub c Les threads sont lents :-( [ par Fildomen ] salutj'ai un prog (tcpclient) où la rapidité compte vraiment,et j'ai réalisé que quand j'utilise les thread, mon prog devient lent, et quand j'execute ThreadPool avec 1000 requetes [ par darkolite ] Bonjour messieurs (dames?)Je lutte depuis pas mal de temps avec le ThreadPool en C#. Je ne sais pas si c'est d'ailleurs la meilleurs solution. Voila c


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,200 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales