Таймер в программе на основе консоли [дубликат]

C # с именем EventWaitHandle - путь сюда. Создайте экземпляр дескриптора ожидания в каждом процессе, который хочет использовать этот файл, и дайте ему имя, которое будет использоваться всеми этими процессами.

EventWaitHandle waitHandle = new EventWaitHandle(true, EventResetMode.AutoReset, "SHARED_BY_ALL_PROCESSES");

Затем при доступе к файлу подождите waitHandle и когда законченный файл обработки, установите его таким образом, чтобы следующий процесс в очереди мог получить к нему доступ.

waitHandle.WaitOne();
/* process file*/
waitHandle.Set();

Когда вы называете дескриптор ожидания события, это имя является общим для всех процессов в операционной системе. Поэтому, чтобы избежать возможности столкновений, используйте руководство для имени («SHARED_BY_ALL_PROCESSES» выше).

1
задан Eng.Fouad 31 March 2013 в 18:35
поделиться

3 ответа

Измените свой код на это

timer t=new timer();
t.start();
while (t.isAlive()) {//not sure what to put in my while statement
    System.out.print("Guess a word on the board! ");
    if(test.CheckGame(scan.next())==true){
        System.out.print("Good job! ");
    }
    else    
        System.out.print("Guess again! ");
}

. Когда функция запуска завершена, t.isAlive будет ложным. Вам также может понадобиться передать объект таймера и проверить объект isAlive () объекта в зависимости от того, как работает CheckGame. Это значит, что вход не может быть введен через 10 секунд в течение неопределенного периода времени.

1
ответ дан ctlevi 21 August 2018 в 01:54
поделиться
  • 1
    проблема заключается в том, что если пользователь находится в середине цикла while, цикл не будет немедленно завершен – Louis B 31 March 2013 в 19:02
  • 2
    Возможно, вам придется передать объект таймера другим методам и проверить его перед сканированием для ввода. Прежде чем принимать их вход, вы также можете проверить таймер. Как работают методы проверки слов и ввода? – ctlevi 31 March 2013 в 19:08

У вас может быть общее логическое значение, в котором ваш поток и основной общий ресурс синхронизированы.

Таймер может быть следующим:

class timer extends Thread{//thread
private Object lock = new Object(); // a lock used by both your thread and main to access stop boolean
private boolean stop = false;
public void setStop() // your thread calls this method in order to set stop
{
   synchronized(lock) {
   stop = true;
   }
}

public boolean getStop() // main calls this to see if thread told main to stop.
{
   boolean _stop;
   synchronized(lock) {
   _stop = stop;
   }
   return _stop;
}
public void run(){
    for(int i=10;i>=0;i--){
        System.out.print(i+" ");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        setStop();
    }
}
}

Ваш основной может быть следующим образом :

timer t=new timer();
            t.start();
            while (!t.getStop()) {// calls getStop to see if other thread told main to stop
                System.out.print("Guess a word on the board! ");
                if(test.CheckGame(scan.next())==true){
                    System.out.print("Good job! ");
                }
                else    
                    System.out.print("Guess again! ");
            }
            t.join(); // to make sure main terminates after the termination of other thread
0
ответ дан hmatar 21 August 2018 в 01:54
поделиться
  • 1
    вы можете дать мне пример кода, как это сделать, потому что я изучал многопоточное программирование несколько часов назад – Louis B 31 March 2013 в 18:44
  • 2
    Спасибо! мой единственный вопрос заключается в том, что если человек находится в середине цикла while и таймер закончился, потому что вы можете только проверить, закончился ли таймер в начале цикла while, это прекратит цикл while, даже если пользователь находится в середине набора? – Louis B 31 March 2013 в 18:47
  • 3
    Я продолжаю получать эти ошибки, когда я пытаюсь выполнить код: Исключение в потоке & quot; main & quot; java.lang.NullPointerException на timer.getStop (ultimateTest.java:18) на finalTest.main (ultimateTest.java:160) Исключение в потоке & quot; Thread-0 & quot; java.lang.NullPointerException на timer.setStop (ultimateTest.java:10) на timer.run (ultimateTest.java:32) – Louis B 31 March 2013 в 18:56
  • 4
    @LouisB это потому, что я забыл инициализировать lock в private Object lock = new Object(). Теперь он должен работать без исключения. – hmatar 1 April 2013 в 21:57
  • 5
    моя проблема все еще остается, как получить цикл while, чтобы завершить одно время, когда я нахожусь в цикле? – Louis B 2 April 2013 в 03:59

Вот простая демонстрация, которая позволит вам узнать, как использовать java.util.Timer.

import java.util.Timer;
import java.util.TimerTask;
import java.util.Scanner;
class Tester 
{
    static long i = 0;
    public static void main(String[] args) throws Exception
    {
        Scanner scanner = new Scanner(System.in);
        System.out.println("You have only 10 seconds to find the result");
        System.out.println("What is the value of : 111111 X 111111 ");
        Timer timer = new Timer("Timer");
        timer.schedule(new TimerTask()
        {
            public void run()
            {
                if (i == 12345654321L)
                {
                    System.out.println("Congrats!! you guessed the write answer :)");
                }
                else
                {
                    System.out.println("Sorry Time is over. You couldn't guess the correct answer.");
                }
                System.exit(0);
            }
        },10 * 1000 , 1);
        while (true)
        {
            i = scanner.nextLong(); 
            if ( i == 12345654321L)
            {
                System.out.println("Congrats!! you guessed the write answer :)");
                System.exit(0);
            }
            else
            {
                System.out.println("Try next  guess :");
            }
        }
    }
}

EDIT

Так как я не знаю, t иметь ваш весь код, поэтому я размещаю здесь решение для вашего ответа по моему основному предположению. Не используйте Thread. Вместо этого используйте java.util.Timer. Ваш код будет выглядеть следующим образом:

static String input=" ";//created a static variable input to take input 
public static void main(String st[])
{
    Timer timer = new Timer("Timer");
    timer.schedule(new TimerTask()
    {
        public void run()
        {
            if (test.CheckGame(input))
            {
                System.out.println("Congrats!! you guessed the write answer :)");
            }
            else
            {
                System.out.println("Sorry Time is over. You couldn't guess the correct answer.");
            }
            System.exit(0);
        }
    },10 * 1000 , 1);//waits for 10 seconds
    while (true) 
    {
        System.out.print("Guess a word on the board! ");
        input = scan.next();
        if(test.CheckGame(input))
        {
            System.out.print("Good job! ");
            System.exit(0);
        }
        else
        {
            System.out.println("Bad Guess. Try again ");
        }
    }
}
1
ответ дан Vishal K 21 August 2018 в 01:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: