In mijn applicatie start ik een thread op met:
Deze thread start twee andere threads:
WorkDone() blijft doorlopen met een loop die test of de twee threads klaar zijn (een teller) om daarna het uitgevoerde werk samen te voegen.
Dit alles zit verpakt in een class waar ik Form variable is opgenomen. Deze krijgt de referentie van de form mee die de thread opstart. De applicatie kent twee forms dus de applicatie draait met maximaal 4 threads. Elke form houdt zelf bij wat de stand van zaken is.
Als de user het programma sluit moeten de thread ook stoppen. Dit gebeurt middels een delegate die uitgevoerd aangeroepen wordt door de thread.
Delform is dus de afgeleide van de Form die de thread heeft opgestart.
Bij een 1 wordt de teller in de Form (die de thread heeft opgestart) met 1 opgehoogd. Bij 2 wordt alleen de status uitgelezen en bij 0 wordt de teller in de Form met één verlaagd.
Het probleem is nu dat mijn applicatie een "A first chance exception of type 'System.ObjectDisposedException' occurred in System.Windows.Forms.dll" geeft. (Debugger).
Dus lijkt het alsof de Form eerder gesloten wordt dan dat de threads gecanceld zijn en de teller in de Form(s) weer op 0 staat. Eigenlijk zou pas dan de Form mogen sluiten.
De code om de forms mee af te sluiten:
Form1 + 2:
Als ik de break uit de loops haal hangt de applicatie. Blijkbaar bereiken de tellers geen 0. Bij het afsluiten treedt er een exceptie op in ProcessData1() (origine van de exceptie is de DelForm.Invoke). Blijkbaar mag dat niet meer op dat tijdstip. exitOverride geeft trouwend het startschot aan de thread om te stoppen (if ((bool)this.DelForm.Invoke(new GetExit(this.getexit), 2) == true)).
De threads stoppen wel (de applicatie sluit dus af maar dat alleen door het afvangen van de excepties en de returns). Maar toch heb ik het gevoel dat ik niet op een juist spoor zit of dat het beter/mooier kan.
Wie kan er iets over vertellen / een duw in de juiste richting geven. Om de applicatie zonder excepties te kunnen afsluiten.
code:
1
| ThreadPool.QueueUserWorkItem(new WaitCallback(this.WorkDevider), obj); |
Deze thread start twee andere threads:
code:
1
2
3
4
5
| this.t1 = new Thread(new ThreadStart(this.ProcessData1)); this.t1.Start(); this.t2 = new Thread(new ThreadStart(this.ProcessData2)); this.t2.Start(); this.WorkDone(); |
WorkDone() blijft doorlopen met een loop die test of de twee threads klaar zijn (een teller) om daarna het uitgevoerde werk samen te voegen.
Dit alles zit verpakt in een class waar ik Form variable is opgenomen. Deze krijgt de referentie van de form mee die de thread opstart. De applicatie kent twee forms dus de applicatie draait met maximaal 4 threads. Elke form houdt zelf bij wat de stand van zaken is.
Als de user het programma sluit moeten de thread ook stoppen. Dit gebeurt middels een delegate die uitgevoerd aangeroepen wordt door de thread.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| private void ProcessData1() { try { //do work this.DelForm.Invoke(new GetExit(this.getexit), 1); this.Blend1(); if ((bool)this.DelForm.Invoke(new GetExit(this.getexit), 2) == true) { this.DelForm.Invoke(new GetExit(this.getexit), 0); return; } //end work ((Form)this.DelForm).Invoke(new UpdateWorkCount(this.AddWorkcount), null); this.DelForm.Invoke(new GetExit(this.getexit), 0); } catch { return; } } |
Delform is dus de afgeleide van de Form die de thread heeft opgestart.
Bij een 1 wordt de teller in de Form (die de thread heeft opgestart) met 1 opgehoogd. Bij 2 wordt alleen de status uitgelezen en bij 0 wordt de teller in de Form met één verlaagd.
Het probleem is nu dat mijn applicatie een "A first chance exception of type 'System.ObjectDisposedException' occurred in System.Windows.Forms.dll" geeft. (Debugger).
Dus lijkt het alsof de Form eerder gesloten wordt dan dat de threads gecanceld zijn en de teller in de Form(s) weer op 0 staat. Eigenlijk zou pas dan de Form mogen sluiten.
De code om de forms mee af te sluiten:
Form1 + 2:
code:
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
| private void closeF2() { this.timer1.Enabled = false; try { if (this.f2 != null) { if (f2.Visible == true) { if (f2.CancloseF2 != 0) { f2.closeF2fromF1(); Int32 i = 0; while (f2.CancloseF2 != 0) { i++; if (i == 100) { break; } } } } f2.Close(); } this.Close(); } catch { } } //Code in Form2 public void closeF2fromF1() { if (this.MultiP != null) { this.timer1.Enabled = false; this.MultiP.exitOverride = true; Int32 i = 0; while (this.CancloseF2 != 1) { i++; if (i == 100) { break; } } } } |
Als ik de break uit de loops haal hangt de applicatie. Blijkbaar bereiken de tellers geen 0. Bij het afsluiten treedt er een exceptie op in ProcessData1() (origine van de exceptie is de DelForm.Invoke). Blijkbaar mag dat niet meer op dat tijdstip. exitOverride geeft trouwend het startschot aan de thread om te stoppen (if ((bool)this.DelForm.Invoke(new GetExit(this.getexit), 2) == true)).
De threads stoppen wel (de applicatie sluit dus af maar dat alleen door het afvangen van de excepties en de returns). Maar toch heb ik het gevoel dat ik niet op een juist spoor zit of dat het beter/mooier kan.
Wie kan er iets over vertellen / een duw in de juiste richting geven. Om de applicatie zonder excepties te kunnen afsluiten.