23. juli 2009 - 09:45Der er
10 kommentarer og 1 løsning
Vent i forløkke til event er behandlet
Hej
Jeg har en en IR modtager, som skal lære nolge koder fra en fjernbetjening.
Jeg har lavet et stykke kode hvor jeg trykker på en knap og derefter har 5 sekunder til at trykke på knappen (Learn) på fjernbetjeningen. Ligeså snart jeg trykker modtages et event med IR koden. Det jeg gerne vil er at udvide koden så jeg kan learne flere koder i træk uden at skulle trykke på Learn-knappen hver gang - dvs. de skal komme lige efter hinanden. Antallet af koder jeg skal learne bestemmes ud fra items i en liste.
Kode:
for (itemIndex = 0; itemIndex < listViewIRAdded.Items.Count; itemIndex++) { LearnNext(); //Gå ikke videre med den næste før den første er learned. //while (!isLearned) { Thread.Sleep(10); } }
- Jeg itererer igennem listen for at få hvert item. - Jeg kalder en funktion der starter learning. - TODO: Vent med at gå videre i løkken før jeg har modtaget og behandlet mit event med data.
Du kunne prøve at se på System.Threading.AutoResetEvent.
Deklarér en variabel af typen, som kan tilgåes både af den metode som "learner" og din løkke.
I din "Learn" metode kalder du Set() metoden på eventet når den er færdig med at learne og i løkken kalder du WaitOne() metoden på eventet når du har sat den i gang med at learne.
Jeg tror du har ret at det er AutoResetEvent jeg skal have fat i. Har prøvet at kigge lidt på nogle eksempler, men synes det ser indviklet ud. Kunne du prøve at give et eksempel på hvordan det skulle implementeres?
Altså noget á la dette?:
AutoResetEvent autoEvent = new AutoResetEvent(false);
for (itemIndex = 0; itemIndex < listViewIRAdded.Items.Count; itemIndex++) { LearnNext(); //Gå ikke videre med den næste før den første er learned. RegisteredWaitHandle handle = ThreadPool.RegisterWaitForSingleObject(autoEvent, EventHandler, "TEST", 3000, false);
AutoResetEvent are = new AutoResetEvent(false); [...]
for(;;) { LearnNext(); are.WaitOne(); }
void DataReceived(string data) { //Behandl data are.Set(); }
Jeg går her ud fra, at din "LearnNext()" sætter en eller anden lytning i gang i en anden tråd, som så kalder DataReceived(string). Imens blocker den tråd din løkke kører i indtil DataReceived kalder are.Set();
DataReceived bliver vel kaldt i den tråd som lytter efter og behandler data? WaitOne() kaldet blokerer jo kun løkken. Og den vil fortsætte når dit event bliver signaleret af den tråd som afvikler DataReceived.
Der lyttes på DataRecived eventet i mainformen, hvor løkken også ligger. Så når WaitOne() kaldes blokerer den for mainformen så den ikke kan modtage events.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.