Java: Реализация нового потока, теперь мой код выполняется дважды - PullRequest
2 голосов
/ 20 января 2012

На днях я задал еще один вопрос о вводе с клавиатуры, находясь внутри свингового графического интерфейса - на самом деле ввод MCR.Один пользователь нашел низкоуровневую клавиатуру, которую кто-то написал.Очень круто, и это в основном работает.Я должен был изучить некоторые новые вещи, чтобы осуществить это (всегда рад сделать это), и я, возможно, не до конца понимаю, что происходит.

Дело в том, и я опубликую код ниже, теперь он проходит через цикл while (while success == false, в CardRead.java) дважды, когда я реализую поток для перехвата клавиатуры.Если я напишу пример данных кода, он будет проходить только один раз.Если я удаляю хук клавиатуры и использую обычный Scanner.nextLine () (что означает, что я должен щелкнуть в консоли, чтобы предоставить ввод приложению), он запускается только один раз.Начать новую тему с наблюдателем для ввода с клавиатуры?Дважды.Я не понимаю, почему или как это исправить.Я был бы счастлив просто понять, что именно происходит - если один из вас покажет мне, как это исправить, я буду в восторге.

Вот код:

CardRead.java

public class CardRead {

public static String raw_card_data;

int readcount = 1;

String[] tracks = new String[2];
String[] tracks_final = new String[2];

public static void main() 
{
    // This doesn't happen until after card is swiped, dunno why.
    //GUI.outputArea.setText(GUI.outputArea.getText() + "\n\n Scan card \n");

    boolean success = false;

    while (success == false)
    {
        //raw_card_data = "%test?;testing?"; // <-- using this, runs thru once

        // using THIS, runs through twice.
        // create an event source - reads from stdin
        final KB_EventSource evSrc = new KB_EventSource();

        // create an observer
        final KB_RespHandler respHandler = new KB_RespHandler();

        // subscribe the observer to the event source
        evSrc.addObserver( respHandler );

        // starts the event thread
        Thread kb_thread = new Thread(evSrc);
        kb_thread.start();

        // sleep until card swiped
        while (raw_card_data == null)
        {
            try
            {
                Thread.sleep(1000);

            }
            catch (Exception e)
            {
                System.out.println(e.getMessage());
            }
        }
        System.out.println(raw_card_data);

                // Tokenize raw_card_data
        StringTokenizer tokenizer = new StringTokenizer(raw_card_data, "?");
        int i = 0;
        do
        {
            tracks[i] = tokenizer.nextToken();
            System.out.println(i + ": " + tracks[i]);
            i++;
        }
        while (tokenizer.hasMoreTokens());
        //System.out.println(track1);
        //System.out.println(track2);
        tracks_final[0] = tracks[0].substring(1,tracks[0].length());
        if (tracks[1] != null)
        {
            tracks_final[1] = tracks[1].substring(1,tracks[1].length());
        }   
        if ( (readcount <= 5) && ( (tracks_final[0].equals("E") || tracks_final[0].equals(null) ) || (tracks_final[1].equals("E") || tracks_final[1].equals(null)) ) )
        {
            GUI.notout.setText("Card Read Unsuccessful. Scan Again.");
            GUI.outputArea.setText(GUI.outputArea.getText() + "Card read unsuccessful. Scan again. \n");
            success = false;
            readcount++;
        }
        else if (readcount <= 5)
        {
            GUI.notout.setText("Card Successfully Read");
            GUI.outputArea.setText(GUI.outputArea.getText() + "\n Success! \n");
            GUI.outputArea.setText(GUI.outputArea.getText() + "Track 1 = " + tracks_final[0] + "\n");
            GUI.outputArea.setText(GUI.outputArea.getText() + "Track 2 = " + tracks_final[1] + "\n");
            success = true;
        } // end if else chain
       } // end while success == false
} // end public void main
} // end class CardRead

KB_RespHandler.java

import java.util.Observable;
import java.util.Observer;

public class KB_RespHandler implements Observer 
{
private String resp;
    public void update (Observable obj, Object arg)
    {
        if (arg instanceof String) 
        {
            resp = (String) arg;
            CardRead.raw_card_data = resp;           
        }
    }
}

KB_EventSource.java

import de.ksquared.system.keyboard.*;
import java.util.Observable; 

public class KB_EventSource extends Observable implements Runnable
{
public static String temp = "";
public static String output = "";

public void run() 
{   

    new GlobalKeyListener().addKeyListener(new KeyAdapter() 
    {
        @Override public void keyPressed(KeyEvent event)
        { 
            switch(event.getVirtualKeyCode())
            {
            case KeyEvent.VK_0:
                if (event.isShiftPressed() == true)
                    temp += ")";
                else if (event.isShiftPressed() == false)
                    temp += "0";
                break;
            case KeyEvent.VK_1:
                if (event.isShiftPressed() == true)
                    temp += "!";
                else if (event.isShiftPressed() == false)
                    temp += "1";
                break;
            /*insert processing for other keys here*/
            case KeyEvent.VK_SPACE:
                if (event.isShiftPressed() == true)
                    temp += " ";
                else if (event.isShiftPressed() == false)
                    temp += " ";
                break;
            case KeyEvent.VK_RETURN:
                /*if (event.isShiftPressed() == true)
                    temp += "\n";
                else if (event.isShiftPressed() == false)
                    temp += "\n";*/
                setChanged();
                notifyObservers(temp);
                //clearChanged();
                  break;                                                                        
            } // end switch (event.getVirtualKeyCode())*/
        } // end public void keyPressed
    });
    while(true)
    try 
    { 
        Thread.sleep(100); 
    }
    catch(InterruptedException e) 
    { 
        e.printStackTrace(); 
    }
}
} 

Итак, я не знаю, что происходит.Я думал, может быть, мне нужно остановить поток kb_thread после получения ввода, но я не могу найти способ сделать это.thread.stop() и thread.destroy() устарели, и Eclipse и Google говорят мне не использовать их.И это может быть даже не то, что мне нужно делать в любом случае.

1 Ответ

0 голосов
/ 20 января 2012

Комментарий в «CardRead.java» гласит «что при успехе изменит успех = true».

Значит ли это, что он может потерпеть неудачу, поэтому он не изменится success?

Если это правда, то raw_card_data все равно будет не нулевым, и он попытается снова.

Я предполагаю, что вы в какой-то момент снова сбрасываете raw_card_data на ноль.

С другой стороны, это:

if (event.isShiftPressed() == true)
    temp += ")";
else if (event.isShiftPressed() == false)
    temp += "0";

можно упростить до:

if (event.isShiftPressed())
    temp += ")";
else
    temp += "0";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...