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

Windows Forms Discussion :

backgroundworker dans l'action formClosing


Sujet :

Windows Forms

  1. #1
    Membre régulier
    Inscrit en
    Mars 2003
    Messages
    217
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 217
    Points : 73
    Points
    73
    Par défaut backgroundworker dans l'action formClosing
    Bonjour,
    Je suis en train de mettre en place une action qui permet d'enregistrer mes données quand je clique sur le X pour fermer mon application. Dans formClosing, j'appelle ma fonction save qui declenche un backgroundworker popur effectuer le traitement de mes enregistrement.

    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
            private void save()
            { 
                //transferer tout les données dans un datatable
     
     
                //tag
                List<Tag> tags = db.getTags();
                tag = new DataTable("Tags");
                tag.Columns.Add("id");
                tag.Columns.Add("tag");
                tag.Columns.Add("name");
                foreach (Tag t in tags)
                {
                    string[] values=new string[]{t.index.ToString(),t.tagName,t.variableName};
                    tag.Rows.Add(values);
                }
     
                //data PCA
                dataPCA = tableData.getDataView(tags);
                dataPCA.TableName = "data_PCA";
                //reformater l'entête des colonnes
                for (int i = 0; i < dataPCA.Columns.Count; i++)
                {
                    if (!dataPCA.Columns[i].ColumnName.Equals("Date"))
                    {
                        dataPCA.Columns[i].ColumnName = Regex.Split(dataPCA.Columns[i].ColumnName, "\r\n")[1];
                    }
                }
     
                //Model overview
                Double[] percent = pca.getVariabilityPercent();
                modelOverview = new DataTable("PCA_PERCENT_data_PCA");
                modelOverview.Columns.Add("componentPercent");
                for (int i = 0; i < percent.GetLength(0); i++)
                {
                    modelOverview.Rows.Add(percent[i]);
                }
                //Variable loadings
                object coeff = pca.variable_loadings;
                object lattent = pca.component_variances;
                object value = new object();
                object circle_x = new object();
                object circle_y = new object();
                loading_circle.loading_circleClass circle = new loading_circle.loading_circleClass();
                circle.Loading(3, ref value, ref circle_x, ref circle_y, coeff, lattent);
                double[,] v = (double[,])value;
                //Scores
                double[,] scoresPCA = (double[,])pca.scores;
                loadings = new DataTable("PCA_VAR_data_PCA");
                scores = new DataTable("scores");
     
                for (int i = 0; i < v.GetLength(1); i++)
                {
                    loadings.Columns.Add("component" + i);
                    scores.Columns.Add("component" + i);
                }
                for (int i = 1; i <= v.GetLength(0); i++)
                {
                    object[] table = new object[v.GetLength(1)];
     
                    for (int j = 1; j <= v.GetLength(1); j++)
                    {
                        table[j - 1] = v.GetValue(i, j);
     
                    }
                    loadings.Rows.Add(table);
                }
     
                for (int i = 1; i <= scoresPCA.GetLength(0); i++)
                {
                    object[] tableScores = new object[scoresPCA.GetLength(1)];
                    for (int j = 1; j <= scoresPCA.GetLength(1); j++)
                    {
                        tableScores[j - 1] = scoresPCA.GetValue(i, j);
                    }
     
                    scores.Rows.Add(tableScores);
                }
     
                //Hotelling T2
                Double[] t2 = pca.getHotellingT2();
                hottelingT2 = new DataTable("PCA_T2_data_PCA");
                hottelingT2.Columns.Add("t2Value");
                for (int i = 0; i < t2.Length; i++)
                {
                    hottelingT2.Rows.Add(t2[i]);
                }
     
                // Create new SaveFileDialog object
                SaveFileDialog DialogSave = new SaveFileDialog();
     
                // Default file extension
                DialogSave.DefaultExt = "txt";
     
                // Available file extensions
                DialogSave.Filter = "worksheet (*.xls)|*.xls|csv (*.csv)|*.csv";
     
                // Adds a extension if the user does not
                DialogSave.AddExtension = true;
     
                // Restores the selected directory, next time
                DialogSave.RestoreDirectory = true;
     
                // Dialog title
                DialogSave.Title = "Save data analysis";
     
                // Startup directory
                DialogSave.InitialDirectory = projectName;//@"C:/";
     
                // Show the dialog and process the result
                if (DialogSave.ShowDialog() == DialogResult.OK)
                {
                    fileName = DialogSave.FileName;
                    ProgressForm progressForm = new ProgressForm(pcaWorker);
                    progressForm.MdiParent = this;
                    progressForm.Show();
     
                    pcaWorker.RunWorkerAsync("save");
                }
     
     
                DialogSave.Dispose();
                DialogSave = null;
     
     
                //transférer les données dans un fichier cvs
            }
    Le problème est que mon application se ferme avant que runWorkerAsyn ait terminé ses actions. Y a t-il un moyen de signaler qu'un backgroundworker est en cours et par conséquence mon application reste ouverte?
    Merci de votre aide

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 170
    Points : 12 290
    Points
    12 290
    Par défaut
    Partagez avec le BackgroundWorker un EventHandler qu'il déclenchera à sa fin.

    Dans la méthode Close, attendez le déclenchement de cet Event.

  3. #3
    Membre régulier
    Inscrit en
    Mars 2003
    Messages
    217
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 217
    Points : 73
    Points
    73
    Par défaut
    la fin du backgroundworker s'éxecute dans runcompleted. Comment je peux faire pour ajouter l'eventHandler? En effet, je ne peux porter l'eventhandler jusque là.

    Merci

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 170
    Points : 12 290
    Points
    12 290
    Par défaut
    Vous savez, semble-t-il, déjà passer des paramètres à la méthode d'un thread (utilisation de pcaWorker).
    Sinon regardez sur ces forum, il y eu une réponse sir ce sujet récemment.
    En passent l'event en paramètre de la méthode du thread, vous pourrez le déclencher à la fin de la méthode ou en cas d'erreur.

    Attention, je vous conseil d'attendre la fin du thread dans OnClosing car vous aurez annuler la fermeture en cas d'erreur durant la sauvegarde.

Discussions similaires

  1. Réponses: 9
    Dernier message: 05/11/2008, 21h26
  2. [Struts] [JavaBean] Deux beans dans une Action
    Par jak0 dans le forum Struts 1
    Réponses: 2
    Dernier message: 19/05/2005, 16h02
  3. Réponses: 4
    Dernier message: 11/02/2005, 14h20
  4. Réponses: 3
    Dernier message: 30/07/2004, 10h51
  5. [JSP] [STRUTS] Switch dans une action
    Par babylone7 dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 28/07/2004, 15h21

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