IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

mon application est bloquée, freeze


Sujet :

C#

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 14
    Par défaut mon application est bloquée, freeze
    Bonjour comment lancer l'attente d'un programme ou lancer un traitement assez long sans freezer mon application !

    impossible lors du sleep de deplacer mon application, de la reduire etc....

    merci d'avance

    voila mon code simple, on click sur un bouton qui lance un sleep, ou bien une boucle de 1 à 1000000, impossible durant le traitement de deplacer la form

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
     
    namespace TestPause1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
     
            private void btnENVOYER_Click(object sender, EventArgs e)
            {
                WaitTime(10);
            }
     
     
     
     
            private void WaitTime(int attendre)
            {
                while (0 < attendre)
                {
                    System.Threading.Thread.Sleep(1000); // 1 secondes 1000
                    attendre = attendre - 1;
                    //lblATT.Text = SIMNLib.cFonctions.RightChaine(string.Format("  {0}  ", att), 5);
                    //lblATT.Refresh();
     
                }
     
            }
        }
    }

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Par défaut
    Lance ton processus dans un autre thread

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 14
    Par défaut
    voila j'ai fait un thread pour lancer le sleep mais ca bloque toujours mon application !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;
     
     
    namespace TestThread2
    {
        public partial class Form1 : Form
        {
     
            private Thread t;
            private Label labelTest;
            private delegate void ChangeLabel(string str);
     
            public Form1()
            {
                InitializeComponent();
     
                this.labelTest = new System.Windows.Forms.Label();
                this.labelTest.AutoSize = true;
                this.labelTest.Location = new System.Drawing.Point(29, 23);
                this.labelTest.Size = new System.Drawing.Size(106, 13);
                this.labelTest.Text = "Label avant opération";
                this.Controls.Add(this.labelTest);
     
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                t = new Thread(new ThreadStart(ThreadMethod));
                t.Start();
     
            }
     
            private void ThreadMethod()
            {
                this.Invoke(new ChangeLabel(ChangeLabelText), "Label après opération");
                //les instuctions se trouvant ici seront appelées
                //une fois la méthode ChangeLabelText executée et terminée.
                MessageBox.Show("Invoke terminé");
     
            }
     
            private void ChangeLabelText(string str)
            {
                labelTest.Text = str;
                Thread.Sleep(5000);
            }
     
     
     
     
        }
    }

  4. #4
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Bonjour.

    Réponse à la va-vite.

    Thread.Sleep(5000);
    doit se trouver avant l'appel à

    this.Invoke(new ChangeLabel(ChangeLabelText), "Label après opération");
    En effet dans le code présenté, le Sleep se trouve dans le thread de l'interface, et donc le bloque.

  5. #5
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Par défaut
    Essaye de passer par un backgroungworker sinon.
    Il gérera pour toi la création d'un thread dans lequel tu pourras effectuer le traitement volumineux.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 14
    Par défaut
    Effectivement en deplacant le sleep c est ok

    mais dans ce cas la mon programme principal continu d'avancer et n'attend pas la fin du traitement du thread

    le but est de faire une pause dans le traitement et le reprendre la ou il en etait

    j'ai des progres a faire dans la gestion des threads

    donc je reprend le but est de lancer un traitement (une boucle qui traite un fichier et envoi par email les infos) mais il faut au bout de 5 minutes de traitement mettre celui en pause durant 1 heure et reprendre la ou on en etait !

    Merci de m'aider

  7. #7
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Si le traitement gére des points de reprise, un timer ne fait-il pas l'affaire soit pour lancer un process court dans le thread principal, soit pour lancer dans un thread un process plus long ?


    Sinon, on peut :
    • activer un timer dans le thread secondaire (interval à 5 minutes)
    • définir une variable MustStop à false,
    • dans l'event timer (une fois les 5 minutes écoulées) mettre MustStop à true et désactiver le timer,
    • dans le traitement, tester régulièrement MustStop et si MustStop=true : faire un Sleep(55 minutes), mettre mustStop à false et réactiver le timer.

  8. #8
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Attendre la fin du thread avec un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    while (t.IsAlive)
    DoEvent();
    Citation Envoyé par calagan99 Voir le message
    Essaye de passer par un backgroungworker sinon.
    Il gérera pour toi la création d'un thread dans lequel tu pourras effectuer le traitement volumineux.
    +1 je réfère ça (j'ai plus utilisé les threads en "direct" depuis longtemps).
    Ou alors avec la TPL, c'est pas mal non plus (Mais .NET 4.0)

  9. #9
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Bonjour.

    Citation Envoyé par ericaix13 Voir le message

    donc je reprend le but est de lancer un traitement (une boucle qui traite un fichier et envoi par email les infos) mais il faut au bout de 5 minutes de traitement mettre celui en pause durant 1 heure et reprendre la ou on en etait !

    Merci de m'aider
    Citation Envoyé par Graffito

    Si le traitement gére des points de reprise, un timer ne fait-il pas l'affaire soit pour lancer un process court dans le thread principal, soit pour lancer dans un thread un process plus long ?

    Je pense que la solution de Graffito est celle qui vous conviendrait : un timer qui déclenche le thread de traitement une fois par heure.

    Citation Envoyé par EquinoxeDotNet

    +1 je préfère ça (j'ai plus utilisé les threads en "direct" depuis longtemps).
    Ou alors avec la TPL, c'est pas mal non plus (Mais .NET 4.0)
    Idem pour moi mais ce sont plutôt les "delegate" et les "BeginInvoke" en plus du backgroungworker.

    Pour la TPL, je vais jeter un œil.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 14
    Par défaut
    je suis avec le .NET 4.0 qu'est que le TPL ?

  11. #11
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Par défaut
    Task Parallel Library, divers outils permettant une gestion simple de processus parallélisés. L'autre élément nouveau en .net 4 pour le parallèle est PLINQ (Parallel LINQ). Cela premet de tirer partie des proco multicores.

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 14
    Par défaut
    Merci pour l'info

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. comment savoir si mon application est ouverte sur un poste distant
    Par melancolie dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 08/02/2011, 10h15
  2. Réponses: 20
    Dernier message: 18/05/2008, 16h33
  3. Réponses: 5
    Dernier message: 15/06/2007, 14h56
  4. [Access] Mon application est détruite !!!
    Par mathias dans le forum Access
    Réponses: 4
    Dernier message: 26/06/2003, 14h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo