Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Global Listener, Start & Stop key event, 
:(
    Опции темы
LeSagra
Дата 19.7.2013, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 2.11.2011

Репутация: нет
Всего: нет



Здравствуйте!

Что я хотел бы получить: 
Хочу чтобы при на житии кнопки(например Ф6), запускалась процедура Старт, у работала, и чтобы при нажатии другой кнопки(например Ф8), процедура останавливалась.
Программа должна запускается в втором плане, поэтому нужен 

Покамест я смог получить только запуск процедуры старт, но стоп не реагирует никак, подскажите пожалуйста, буду благодарен!


Подскажите как это сделать помощью нитей, потому как ГЛ он запускается отдельной нитью, оттуда у меня и проблемы.

__Work __
Код

public class Work{
 
    private boolean enable_work = false;
 
    public void start(){
 
        enable_work = true;
        for(;enable_work;){
            //do something
        }
    }
 
    public void stop(){
        enable_work=false;
    }
 
}
 
__Global LISTENER__
Код

import org.jnativehook.GlobalScreen;
import org.jnativehook.NativeHookException;
import org.jnativehook.keyboard.NativeKeyEvent;
import org.jnativehook.keyboard.NativeKeyListener;
 
import java.io.IOException;
 
public class Listener implements NativeKeyListener {
    Work worker = new Work();
 
    public void nativeKeyPressed(NativeKeyEvent e) {
        System.out.println("Key Pressed: " + NativeKeyEvent.getKeyText(e.getKeyCode()));
        if (e.getKeyCode() == NativeKeyEvent.VK_F8) {
            worker.stop();
            GlobalScreen.unregisterNativeHook();
        }
 
        if (e.getKeyCode() == NativeKeyEvent.VK_F7) {
             worker.start();
        }
    }
}
 
Код

    public static void main(String[] args) {
        try {
            GlobalScreen.registerNativeHook();
        }
        catch (NativeHookException ex) {
            System.err.println("There was a problem registering the native hook.");
            System.err.println(ex.getMessage());
 
            System.exit(1);
        }
 
        //Construct the example object and initialze native hook.
        GlobalScreen.getInstance().addNativeKeyListener(new Listener());
    }

PM MAIL   Вверх
LSD
Дата 22.7.2013, 08:31 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(LeSagra @  19.7.2013,  23:06 Найти цитируемый пост)
но стоп не реагирует никак

Что значит "не реагирует"? Нажатие на F8 отлавливается? Метод stop() вызывается? И что находится в цикле? Насколько быстро отрабатывает одна итерация?

в общем добавь логгирования и смотри что происходит.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
LeSagra
  Дата 23.7.2013, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 2.11.2011

Репутация: нет
Всего: нет



LSD:

-Нажатие на F8(кроме Ф8 перепробывал много других кнопок) отлавливается: Следовательно метод стоп не вызывается и поле enable_work не меняется на  false;
-В цикле даже ставил: Thread.sleep(5500); изменений никаких.



 



Это сообщение отредактировал(а) LeSagra - 23.7.2013, 14:36
PM MAIL   Вверх
LSD
Дата 24.7.2013, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(LeSagra @  23.7.2013,  15:34 Найти цитируемый пост)
Нажатие на F8(кроме Ф8 перепробывал много других кнопок) отлавливается: Следовательно метод стоп не вызывается

Очень интересная логика, как из первого следует второе, я не понимаю. smile
По коду видно, что стоп может не вызываться только если e.getKeyCode() != NativeKeyEvent.VK_F8. Ты внутрь условия и метода stop() добавлял логгирование?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
LSD
Дата 24.7.2013, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Проблема в методе start(), ты не запускаешь отдельный поток а начинаешь работу прямо в потоке слушателя. Из-за чего блокируется вся дальнешая обработка событий. Тебе надо вынести цикл в отдельный поток.
Код

package com.example;

public class Work implements Runnable {
    private volatile boolean running = false;

    public void run() {
        while (running) {
            System.out.println("Working");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public void start() {
        running = true;
        new Thread(this).start();
    }

    public void stop() {
        running = false;
    }
}



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
LeSagra
  Дата 24.7.2013, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 2.11.2011

Репутация: нет
Всего: нет



LSD


Спасибо! все работает! 

один вопрос, почему new Thread(this).start(); а не new Thread(this).run(); ??
PM MAIL   Вверх
LSD
Дата 24.7.2013, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(LeSagra @  24.7.2013,  17:25 Найти цитируемый пост)
один вопрос, почему new Thread(this).start(); а не new Thread(this).run(); ??

Потому что метод start() запускает новый поток и именно в этом новом потоке будет выполнятся run(). Если сразу запустить run(), то он будет выполнятся в вызывающем потоке, т.е. получим то же самое поведение.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
LeSagra
Дата 24.7.2013, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 2.11.2011

Репутация: нет
Всего: нет



LSD, спасибо ещо рас, все работает на ура, до связи!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0829 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.