Ik heb een applicatie met 3 threads
thread1 is de hoofdthread, deze start thread2 en 3
thread2 is een thread die on de zoveel tijd in een databse kijkt of er veranderingen zijn, als dat het geval is komt er een event. Dit event wordt in thread1 afgevangen alsvolgt:
speaker is thread3, deze heeft een queue met zinnen die uitgesproken moeten worden. Nu als er iets verandert in de database komt "tell me something" uit de luidsprekers. Mooi dacht ik. Het vervolg een zin met wat meer inhoud:
event handler aangepast:
Getsentence haalt info op uit de database (naam, lokatie, etc.) bouwt hier een zinnetje van en stuurt deze terug.
Nu krijg ik de fout:
Ik heb geprobeerd er een lock(this){ } om speaker.AddQueue te zetten maar dat werkte niet. (speaker is een thread de implementatie van addqueue:
en de speaker thread (ter info):
Waar komt deze fout vandaan en hoe kan ik hem oplossen?
Shit, gevonden:
Ik had in mijn getsentence een fout geknutseld, deze komt zo terug, ik keek alleen op de verkeerde plaats aangezienin de mthod los wel goed getest heb, alleen had ik wat veranderd.....
thread1 is de hoofdthread, deze start thread2 en 3
thread2 is een thread die on de zoveel tijd in een databse kijkt of er veranderingen zijn, als dat het geval is komt er een event. Dit event wordt in thread1 afgevangen alsvolgt:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
| private void DeviceInformationChanged(object source, LocationChangedEventArgs e) { if (this.InvokeRequired) { this.BeginInvoke(new LocRecords.LocationChangedEvent(DeviceInformationChanged), new object[] { source, e }); return; } speaker.AddQueue("tell me something"); } |
speaker is thread3, deze heeft een queue met zinnen die uitgesproken moeten worden. Nu als er iets verandert in de database komt "tell me something" uit de luidsprekers. Mooi dacht ik. Het vervolg een zin met wat meer inhoud:
event handler aangepast:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
| private void DeviceInformationChanged(object source, LocationChangedEventArgs e) { if (this.InvokeRequired) { this.BeginInvoke(new LocRecords.LocationChangedEvent(DeviceInformationChanged), new object[] { source, e }); return; } speaker.AddQueue(this.GetSentence(e.oldLocation, e.newLocation, e.owner, e.device)); } |
Getsentence haalt info op uit de database (naam, lokatie, etc.) bouwt hier een zinnetje van en stuurt deze terug.
Nu krijg ik de fout:
Ik heb gevolg dat het komt dat het event sneller aangeroepen wordt dan dat GetSentence een zin kan bouwen.An unhandled exception of type 'System.Reflection.TargetInvocationException' occurred in mscorlib.dll
Additional information: Exception has been thrown by the target of an invocation.
Ik heb geprobeerd er een lock(this){ } om speaker.AddQueue te zetten maar dat werkte niet. (speaker is een thread de implementatie van addqueue:
C#:
)1
2
3
4
5
6
7
| public void AddQueue(String str) { lock (speakQueue) { speakQueue.Enqueue(str); } } |
en de speaker thread (ter info):
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| private void threadFunction() { SpeechVoiceSpeakFlags SpFlags = SpeechVoiceSpeakFlags.SVSFlagsAsync; SpVoice Voice = new SpVoice(); Voice.Voice = Voice.GetVoices("name = microsoft mary", null).Item(0); while (true) { lock (speakQueue) { if (speakQueue.Count != 0) { String str = (String)speakQueue.Dequeue(); Voice.Speak(str, SpFlags); } else { Thread.Sleep(2000); } } } } |
Waar komt deze fout vandaan en hoe kan ik hem oplossen?
Shit, gevonden:
Ik had in mijn getsentence een fout geknutseld, deze komt zo terug, ik keek alleen op de verkeerde plaats aangezienin de mthod los wel goed getest heb, alleen had ik wat veranderd.....
[ Voor 19% gewijzigd door elgringo op 08-03-2007 10:54 ]
if broken it is, fix it you should