none
Thread.abort ne travaille pas avec les thread en mode sta RRS feed

  • Question

  • Bonjour,

    j'ai une application qui lance des threads en mode STA sous format "form"(animation d'un ballon en WPF).

    tous marche bien, mais le problème c'est que lorsque je veux tuer un thread spécifier par thread.Abort(), le thread ne se tue pas!!

    voici mon code :

            private void ballon_Click(object sender,RoutedEventArgs e)
            {
    
    System.Threading.ThreadStart ts = new System.Threading.ThreadStart(showFormDispatcher);
    
    System.Threading.Thread tt = new System.Threading.Thread(ts);
    
    tt.Start();
    
    listeballons.Add(tt);
    
            }
    
            private void showFormDispatcher()
            {
    
    this.Dispatcher.Invoke(new MethodInvoker(this.showForm));
           
            }
            
            private void showForm()
            {
    
    BallonAnimee.MainWindow ballonanimee = new BallonAnimee.MainWindow();
    
    ballonanimee.Show();
    
            }
            private void tuerballon_Click(object sender, RoutedEventArgs e)
            {
    
    Thread ballondernier = listeballons[listeballons.Count - 1].thread;
                    
    ballondernier.Abort();
                 
            }


    Rayo_Muchacho

    mardi 19 juin 2012 11:23

Réponses

Toutes les réponses

  • Bonjour,

    Appelez la méthode Abort() au niveau des Thread n'est pas du recommandé voir un mauvais design.

    Ne pouvez-vous pas déclencher tout simplement la fermeture de la fenêtre au niveau du "tuerballon_click" ?

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    mardi 19 juin 2012 13:09
    Modérateur
  • Bonjour, est ce que vous avez une autre solution ?

    Rayo_Muchacho

    mardi 19 juin 2012 13:44
  • Bonjour,

    Non.

    Qu'est ce qui vous pose problème exactement ?

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    mardi 19 juin 2012 21:54
    Modérateur
  • Bonjour,

    le but de mon petite application est de lancer un thread (autre application WPF : ballon animée ).

    pour chaque thread lancé on l'enregistre dans une ObservableCollection,

    une autre partie consiste de tuer le thread demander par exemple le dernier créer, pour cela je récupère le thread demander depuis ma collection et je l'est tuer par thread.abort(), mais le problème c'est que le thread ne se tue pas !!!.

    une autre problème c'est qu'il faut prendre en compte la fermeture d'un thread lancée à l'aide de la fameuse croix rouge.

    merci pour votre aide


    Rayo_Muchacho

    mercredi 20 juin 2012 09:13
  • Bonjour,

    Voir peut-être http://www.c-sharpcorner.com/uploadfile/suchit_84/creating-wpf-windows-on-dedicated-threads/ qui explique comment procéder (notamment w.Closed += (sender1, e1) => w.Dispatcher.InvokeShutdown(); ).

    Cette solution me semble être un dernier recours (je n'ai pas vraiment creusé les animations en détails mais j'avais l'impression que WPF permettait déjà d'aller assez loin avant d'avoir à envisager cette solution ?).


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    mercredi 20 juin 2012 09:41
  • Bonjour,

    merci pour votre réponse.

    pour w.Closed += (sender1, e1) => w.Dispatcher.InvokeShutdown(); comment je peux récupérer le thread qui a lancé le window1 w, ou seulement son ID ?.

    cordialement.


    Rayo_Muchacho

    mercredi 20 juin 2012 11:19
  • Voir http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.thread.aspx ce qui permet donc de récupérer le thread associé au Dispatcher (et donc éventuellement le ManagedThreadID du thread).

    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    mercredi 20 juin 2012 12:01
  • Bonjour,

    merci infiniment pour votre aide.

    ça marche bien maintenant.

    cordialement.


    Rayo_Muchacho

    mercredi 20 juin 2012 15:18
  • Bonjour,

    retour de nouveau !

    j'ai un autre problème, il s'agit d' après chaque lancement d'un thread voir ci-dessous

    Thread tt = new Thread(() => { BallonAnimee.MainWindow ballonanimee = new BallonAnimee.MainWindow(); ballonanimee.Show(); ballonanimee.Closed += new EventHandler(ballonanimee_Closed); System.Windows.Threading.Dispatcher.Run(); }); tt.SetApartmentState(ApartmentState.STA); tt.IsBackground = true; tt.Start();

    listethreads.Add(tt);

    je l'enregistre dans une collection de thread (listethreads). jusqu'à maintenant tout est bien! le problème se pose lorsque je veux tuer tous les thread par une seule action par exemple clic sur un bouton voir ci-dessous

    private void tuertout_Click(object sender, System.Windows.RoutedEventArgs e)
            {
                if (listethreads.Count == 0)
                {
                    System.Windows.MessageBox.Show("Il n'y a aucun Thread Ballon lancé !!");
                }
                else
                {
                    foreach (Thread thread in listethreads)
                    {
                        thread.Abort();
                    }
                    listethreads.Clear();
                }
            }

    et voici le message d'erreur que je reçois:

    Tentative d'exécution managée dans le verrou du chargeur

    du système d'exploitation (OS). N'essayez pas d'exécuter du code managé

    dans une fonction d'initialisation d'image ou DllMain,

    car cela risque d'entraîner un blocage de l'application.


    merci pour votre aide !!

    Cordialement.


    Rayo_Muchacho



    jeudi 21 juin 2012 10:38
  • Bonjour,

    Voici le même problème et sa solution :

    http://www.vbfrance.com/forum/sujet-VB2005-PROBLEME-MDA_918551.aspx


    Cordialement, Pascal.

    Développeur Wpf/SilverLight/WinPhone7

    mardi 26 juin 2012 04:45
    Modérateur
  • Bonjour,

    merci de votre réponse

    c'est résolu !!


    Rayo_Muchacho

    mardi 26 juin 2012 09:35