Avatar billede bizcom Novice
22. februar 2007 - 11:28 Der er 7 kommentarer og
1 løsning

Autoreplay i DOSprompt

Hej

Jeg har et dosvindue kørende der laver nogle ting!

På et tidspunkt vil jeg gerne have et svar fra en bruger (J eller N)! Her vil jeg normalt anvende System.in.read()!

MEN! Efter 1 min skal systemet gå videre med evt. J (hvis brugeren forholder sig passivt), men hvis brugeren tykker N skal denne vælges!

Kan dette lade sig gøre?
Kan fint få det løst under awt, men ved ik helt hvordan i et dosvindue....
Avatar billede arne_v Ekspert
22. februar 2007 - 16:09 #1
du bliver nok noedt til at lave noget grimt med en traad og en timer
Avatar billede arne_v Ekspert
06. maj 2007 - 22:52 #2
OK ?
Avatar billede bizcom Novice
07. maj 2007 - 14:16 #3
Hej Arne

Jeg kan ikke rigtig sætte mig ind i hvordan dette ville fungere i dos miljø!?
Avatar billede arne_v Ekspert
08. maj 2007 - 04:50 #4
Ideen er god nok.

Men implementeringen viste sig noget tricky.

Efter en masse forgaeves forsoeg endte jeg op med dette:

import java.io.*;
import java.nio.*;
import java.nio.channels.*;
import java.util.*;

public class TimedRead {
    public String readLine(int ms) throws IOException {
        Timer t = new Timer();
        FileChannel fc = new FileInputStream(FileDescriptor.in).getChannel();
        ByteBuffer bb = ByteBuffer.allocate(80);
        String res = null;
        try {
            t.schedule(new InterruptMe(fc), ms);
            fc.read(bb);
            byte[] b = bb.array();
            int len = bb.position();
            while(len > 0 && (b[len-1] == '\r' || b[len-1] == '\n')) len--;
            res = new String(b, 0, len);
        } catch (AsynchronousCloseException e) {
            res = null;
        }
        t.cancel();
        return res;
    }
    public static void main(String[] args) throws Exception {
        TimedRead tr = new TimedRead();
        System.out.print("Enter something: ");
        String s = tr.readLine(5000);
        System.out.println("You entered: " + s);
    }
}

class InterruptMe extends TimerTask {
    private Channel c;
    public InterruptMe(Channel c) {
        this.c = c;
    }
    public void run() {
        try {
            c.close();
        } catch (IOException e) {
            // ignore
        }
    }
}
Avatar billede bizcom Novice
08. maj 2007 - 09:12 #5
Du er da simpelthen en knag - det dur jo bare :)

Mange tak!!!!!
Avatar billede bizcom Novice
08. maj 2007 - 10:56 #6
Arne - der er en lille bug hvis man kører programmet 2 gange i træk! Det er noget med FileDescriptoren!?

Er det noget du kan se dig ud af?

Ellers virker det bare...
Avatar billede bizcom Novice
08. maj 2007 - 10:57 #7
Når jeg skriver 2 gange i træk, så er det at jeg kalder klassen og readLine 2 gange efter hinanden i samme run!
Avatar billede arne_v Ekspert
09. maj 2007 - 03:19 #8
Hm.

Jeg kan godt genskabe problemet.

Den kommer jeg til at tygge lidt på.

Den closer FileDescriptor.in alias stdin og det er jo ikke så godt.
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester