Hallo,
Dit is mijn eerste aanraking met meerdere threads in C#. Een deel van mijn (te maken) applicatie bestaat uit een netwerk gedeelte wat luistert op een bepaalde poort en meerder clients accepteerd welke commando's kunnen sturen.
Dit gebeurt in meerdere threads: [gui] -> [listener] -> [meerdere clients].
Het te ontvangen bericht moet uiteindelijk terug naar de gui, wat opgelost wordt doormiddel van events.
Het probleem:
Control objecten mogen niet door andere threads aangepast worden.
Dit weet ik. Ik heb meerdere topics hier en artikelen op internet door gelezen. Het probleem moet opgelost worden met behulp van Invoke.
Waar ik de kluts echter kwijt raak ik waar ik die Invoke moet gebruiken, en hoe dat dan correct zou moeten. De meeste voorbeelden werken met een Sender en EventArgs. Mijn delegate functie bevat echter maar 1 argument, een string waarin het bericht komt.
Om het overzichterlijk te houden heb ik even een kleine test applicatie gemaakt:
main form:
Test:
Waar en hoe moet ik nu controleren of er geïnvoked moet worden, en hoe invoke ik vervolgens? Als test heb ik de textbox een keer als argument mee gegeven, en in de thread de textbox geïnvoked. Dit werkt wel, maar dit is niet de correcte oplossing lijkt mij. (ik wil meerdere event handlers kunnen gebruiken).
Kan iemand mij hier duidelijkheid in verschaffen? Met hulp van de gevonden artikelen/topics kom ik er helaas niet uit ...
Dit is mijn eerste aanraking met meerdere threads in C#. Een deel van mijn (te maken) applicatie bestaat uit een netwerk gedeelte wat luistert op een bepaalde poort en meerder clients accepteerd welke commando's kunnen sturen.
Dit gebeurt in meerdere threads: [gui] -> [listener] -> [meerdere clients].
Het te ontvangen bericht moet uiteindelijk terug naar de gui, wat opgelost wordt doormiddel van events.
Het probleem:
Control objecten mogen niet door andere threads aangepast worden.
Dit weet ik. Ik heb meerdere topics hier en artikelen op internet door gelezen. Het probleem moet opgelost worden met behulp van Invoke.
Waar ik de kluts echter kwijt raak ik waar ik die Invoke moet gebruiken, en hoe dat dan correct zou moeten. De meeste voorbeelden werken met een Sender en EventArgs. Mijn delegate functie bevat echter maar 1 argument, een string waarin het bericht komt.
Om het overzichterlijk te houden heb ik even een kleine test applicatie gemaakt:
main form:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| namespace ThreadTest { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Test threadTest = new Test(); threadTest.OnTekst += new Tekst(OnTextHandler); threadTest.Start(); } public void OnTextHandler(string message) { // Dit mag dus niet, maar hoe moet het wel? textBox1.Text = message; } } } |
Test:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| namespace ThreadTest { public delegate void Tekst(string message); class Test { public event Tekst OnTekst; public void Start() { Thread t = new Thread(new ThreadStart(ThrowEvent)); t.Start(); } public void ThrowEvent() { if (OnTekst != null) OnTekst("test"); } } } |
Waar en hoe moet ik nu controleren of er geïnvoked moet worden, en hoe invoke ik vervolgens? Als test heb ik de textbox een keer als argument mee gegeven, en in de thread de textbox geïnvoked. Dit werkt wel, maar dit is niet de correcte oplossing lijkt mij. (ik wil meerdere event handlers kunnen gebruiken).
Kan iemand mij hier duidelijkheid in verschaffen? Met hulp van de gevonden artikelen/topics kom ik er helaas niet uit ...
[ Voor 0% gewijzigd door IceM op 17-07-2007 22:07 . Reden: Typo ]
...