Beste Medetweaker,
Ik zit met een gaar probleem waar ik al een tijd op zit
te tubben en ik kom er niet uit. Wellicht dat een van jullie
mij het licht kan laten zien.
Het gaat over het volgende:
-Ik heb een listener class voor een scan apparaat.
Hierin wordt een functie aangeroepen en een status doorgegeven
als deze van status veranderd. (1 = idle, 2 = offline, 3 = actie
4 = pause / error, 5 klaar)
Wat doe ik nou, ik maak een listener aan op die class en als de status
1 (idle) is dan start ik de scanner. Nu kan ik precies nagaan
wat de status is. Op het moment dat de status 5 is dan kan ik aangeven
dat de listener gestopt moet worden.
Om dat allemaal in goede banen te leiden heb ik 2 functies in die class
aangemaakt te weten setDone en waitDone.
En in diezelfde class heb ik de volgende variabelen gedefinieerd:
private Object condition;
private static boolean done = false;
Het probleem is nu het volgende:
Op het moment dat ik in de status 5 kom roep ik setDone(); aan.
Echter zover kom ik niet eens.
Wat wil het nu, als ik de class "Scanner" aanmaak dan roep ik daarna
ook scanner.waitDone(); aan. Echter deze gaat rechtstreeks naar
de codeline : condition.wait() toe en gaat daar lekker wachten en vervolgens
doet mijn class "Scanner" ook niks meer.
Wat je zou verwachten is dat als ik scanner aanmaak dat deze een "lock" op condition
zet. En als ik dan waitDone() aanroep dan zou deze toch bij synchronisatie
in de wacht gezet moeten worden. Dan kan "scanner" gewoon zijn werk doen, op het moment
dat status 5 de functie setDone aanroept dan wordt er gesynchroniseerd.
Hierdoor kan er verder gegaan worden via de notify functie (notifyAll is niet nodig
omdat er niet meerdere threads staan te wachten)
Heeft iemand een idee waar mijn denk/progammeer/pruts fout zit ?
Bedankt
Ik zit met een gaar probleem waar ik al een tijd op zit
te tubben en ik kom er niet uit. Wellicht dat een van jullie
mij het licht kan laten zien.
Het gaat over het volgende:
-Ik heb een listener class voor een scan apparaat.
Hierin wordt een functie aangeroepen en een status doorgegeven
als deze van status veranderd. (1 = idle, 2 = offline, 3 = actie
4 = pause / error, 5 klaar)
Wat doe ik nou, ik maak een listener aan op die class en als de status
1 (idle) is dan start ik de scanner. Nu kan ik precies nagaan
wat de status is. Op het moment dat de status 5 is dan kan ik aangeven
dat de listener gestopt moet worden.
Om dat allemaal in goede banen te leiden heb ik 2 functies in die class
aangemaakt te weten setDone en waitDone.
code:
1
2
3
4
5
6
7
8
| private void setDone() {
synchronized (condition) {
done = true;
//Log.logEvent("BaseCallback","waitDone","notify, done set to true");
condition.notifyAll();
//Log.logEvent("BaseCallback","waitDone","notify done");
}
} |
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| public void waitDone() {
//Log.logEvent("BaseCallback","waitDone","Enter waitDone");
synchronized (condition) {
//Log.logEvent("BaseCallback","waitDone","condition synched");
if (!done)
{
//Log.logEvent("BaseCallback","waitDone","!done");
try {
//Log.logEvent("BaseCallback","waitDone","before wait");
condition.wait();
//Log.logEvent("BaseCallback","waitDone","after wait");
} catch (InterruptedException e) {
//Log.logEvent("BaseCallback","waitDone","InterruptedException " +e.getMessage());
}
}
}
} |
En in diezelfde class heb ik de volgende variabelen gedefinieerd:
private Object condition;
private static boolean done = false;
Het probleem is nu het volgende:
Op het moment dat ik in de status 5 kom roep ik setDone(); aan.
Echter zover kom ik niet eens.
Wat wil het nu, als ik de class "Scanner" aanmaak dan roep ik daarna
ook scanner.waitDone(); aan. Echter deze gaat rechtstreeks naar
de codeline : condition.wait() toe en gaat daar lekker wachten en vervolgens
doet mijn class "Scanner" ook niks meer.
Wat je zou verwachten is dat als ik scanner aanmaak dat deze een "lock" op condition
zet. En als ik dan waitDone() aanroep dan zou deze toch bij synchronisatie
in de wacht gezet moeten worden. Dan kan "scanner" gewoon zijn werk doen, op het moment
dat status 5 de functie setDone aanroept dan wordt er gesynchroniseerd.
Hierdoor kan er verder gegaan worden via de notify functie (notifyAll is niet nodig
omdat er niet meerdere threads staan te wachten)
Heeft iemand een idee waar mijn denk/progammeer/pruts fout zit ?
Bedankt