Bonjour,
J'ai une petite question sur les threads et les progress bar dans une fenêtre model.
Voila... mon but est de créer une fenêtre modal qui contient un progress bar que je pourrais réutiliser dans plusieurs cas différents de mon application... et de donner également la possibilité à d'autre de pas l'utiliser....
J'ai donc créer une interface qui me donne la possibité d'afficher une fenêtre puis de faire avancer la progress bar et ensuite de la fermer....
Ensuite j'implémente mon interface dans la fenêtre...
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 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ManagerLibs.Views { /// <summary> /// /// </summary> public interface ILoading { void ShowWindow(); void CloseWindow(); void SetTitle(string title); void SetMaxTime(long max); void SetCurrentTime(long time); } }
Puis dans un contrôleur plus loin je créer cette fenêtre et la donne à un autre contrôleur (...)
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 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 ManagerLibs.Views { public partial class LoadingForm : Form, ILoading { public LoadingForm() { InitializeComponent(); } public void ShowWindow() { this.ShowDialog(); } public void CloseWindow() { this.Close(); } public void SetTitle(string title) { this.Text = title; } public void SetMaxTime(long max) { this.progressBar.Maximum = (int)max; } public void SetCurrentTime(long time) { this.progressBar.Value = (int)time; } } }
Et enfin le code du dernier contrôleur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 CsvController csvController = CsvController.getInstance(); LoadingForm loadingForm = new LoadingForm(); List<CsvTable> table = (List<CsvTable>)csvController.LoadFile(loadingForm, dialog.FileName); dataGridCSV.DataSource = table;
et le code qui prend du temps (la raison pour laquelle je fais un thread)
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 public IEnumerable LoadFile(ILoading progress, String file) { m_ProgressBar = progress; m_File = file; m_TotalNumberOfLine = this.CoutLinesInFile(); m_ProgressBar.SetMaxTime(m_TotalNumberOfLine); m_Table = new List<CsvTable>(); m_Worker = new Thread(this.ReadFile); try { m_Worker.IsBackground = true; m_Worker.Start(); m_ProgressBar.SetTitle("Reading CSV File..."); m_ProgressBar.ShowWindow(); m_Worker.Join(); } catch (Exception e) { throw new Exception(e.Message); } return m_Table; }
Voila voila alors je sais tout le monde me conseil le fameux backgroundWorker mais je ne trouve pas cette solution intéressante car je dois mettre le code de mon contrôleur dans la fenêtre et créer une fenêtre abstraite que je pourrais etendre pour chaque contrôleur ne m'intéresse pas non plus (dans le cas ou je voudrais utiliser cette même fenêtre de progression dans plusieurs contrôleurs différents)
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 private void ReadFile() { try { var csvFile = File.ReadAllLines(@m_File); var currentTime = 0; foreach (String row in csvFile) { var formatedRow = row.Split(m_Delimiter); CsvTable temp = new CsvTable(); temp.id = formatedRow[0]; temp.value1 = formatedRow[1]; temp.value2 = formatedRow[2]; temp.value3 = formatedRow[3]; temp.value4 = formatedRow[4]; ((List<CsvTable>)m_Table).Add(temp); m_ProgressBar.SetCurrentTime(currentTime++); } Thread.Sleep(100); m_ProgressBar.CloseWindow(); } catch (Exception exception) { System.Windows.Forms.MessageBox.Show(exception.Message.ToString()); } }
Je sais également que je devrais utiliser le Invoke mais lui aussi ne me plait pas car je suis obligé de passer tout ma fenêtre et non plus simplement l'interface à mon contrôleur... ou alors en faisant des magouilles)
Enfin voila pour la situation mais maintenant le plus intéressant :
Tout fonctionne très bien !!!! Enfin presque si j'exécute l'exe builder mon code fonctionne parfaitement bien.... et là je me dis que c'est déjà pas mal... par contre chose étonnant c'est dans le débugger que j'ai des exceptions... sur le faite bien entendu d'accéder à un contrôle d'une fenêtre depuis un autre thread.... du coup ma question pourquoi ça ne fonctionne en mode debug... ou alors pourquoi est-ce que cela fonctionne que je lance l'appli en exe alors que tout devrait porter à croire que mon appli devrai me renvoyer une exception ???!!!
Désolé pour la pavé mais comme ça du coup si quelqu'un à la patience de me lire et la gentillesse de pouvoir me conseiller ça serait vraiment parfait....
Merci d'avance à toutes les personnes qui pourraient m'aider...
Angle
Partager