Bonjour,
Je commence à développer une application utilisant plusieurs Thread. Pour le moment l'appli est assez simple il s’agit de décoder des enregistrement dans un fichier binaire, et de les stocker dans un Dataset. Pour faire un peu plus userfreindly j’ai ajouté un ProgressBar. La visiblement si l’on veux que le ProgressBar progresse il faut maître le corps du traitement non plus dans le Thread principal (ouvert par le Form) mais dans un Thread secondaire. Et c’est la que je me heurte à un problème de performance, un code pratiquement identique (a l’exception de la déclaration et de l’ouverture du Thread) me fait passer d’un temps de traitement de 7 seconde à plus de 22…
Y aurait il donc une façon de faire particulière pour accélérer la chose ?
Merci d'avance.
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 # region Reading File private void reading(string fileName) { storeDs.Tables["Records"].Clear(); dataGridView.DataSource = null; ewsd = new EwsdReader(); ewsd.open(fileName); startProgression(); RecordReader rec; while ((rec =ewsd.readNextRecord())!= null) { DataRow newRow = storeDs.Tables["Records"].NewRow(); newRow["Index"] = storeDs.Tables["Records"].Rows.Count + 1; newRow["Address"] = rec.address + 1; newRow["Type"] = rec.Name; // read inner data PackageReader pkg; rec.read(); if ((pkg = rec.packages.identify(100)) != null) newRow["DateTime"] = pkg.fields[1].Value; if ((pkg = rec.packages.identify(110)) != null) newRow["ConnectId"] = pkg.fields[2].Value; // sotre data in dataset storeDs.Tables["Records"].Rows.Add(newRow); } stopReading(); } private void startReading(string fileName) { storeDs.Tables["Records"].Clear(); dataGridView.DataSource = null; ewsd = new EwsdReader(); ewsd.open(fileName); startTime = System.DateTime.Now; readingTread = new Thread(new ThreadStart(readDataLoop)); readingTread.Name = "ReadingFile"; readingTread.IsBackground = true; readingTread.Priority = ThreadPriority.BelowNormal; readingTread.Start(); startProgression(); } private void readDataLoop() { while (Thread.CurrentThread.IsAlive) { this.Invoke(new process(storeData)); } } private void storeData() { RecordReader rec=ewsd.readNextRecord(); if (rec != null)// End of file { // crearte new row in dataset DataRow newRow = storeDs.Tables["Records"].NewRow(); newRow["Index"] = storeDs.Tables["Records"].Rows.Count + 1; newRow["Address"] = rec.address + 1; newRow["Type"] = rec.Name; // read inner data PackageReader pkg; rec.read(); if ((pkg = rec.packages.identify(100)) != null) newRow["DateTime"] = pkg.fields[1].Value; if ((pkg = rec.packages.identify(110)) != null) newRow["ConnectId"] = pkg.fields[2].Value; // sotre data in dataset storeDs.Tables["Records"].Rows.Add(newRow); } else { readingTread.Abort(); stopReading(); } } private void stopReading() { DataView dv = new DataView(storeDs.Records); dataGridView.DataSource = dv; dataGridView.Refresh(); stopProgression(); } #endregion
Partager