проблема ввода и потока, питон - PullRequest
0 голосов
/ 09 февраля 2009

Я делаю что-то подобное в Python

class MyThread ( threading.Thread ):
    def run (s):
        try:
            s.wantQuit = 0
            while(not s.wantQuit):
                button = raw_input()
                if button == "q":
                    s.wantQuit=1
        except KeyboardInterrupt:
            s.wantQuit = 1

myThread = MyThread ()
myThread.start()

a=5
while not myThread.wantQuit:
    print "hey"
    if (a == 0):
        break;
    a = a-1;
    time.sleep(1)
#"""
sys.exit()

Что происходит, если мое приложение блокируется на 5 секунд, печатая «эй» (5 раз), ТОГДА я получаю диалог raw_input. Как я могу открыть диалоговое окно, чтобы я мог выйти в любое время, а не когда цикл закончится?

Ответы [ 4 ]

1 голос
/ 09 февраля 2009

Вы имеете в виду, что цикл while запускается перед потоком? Ну, вы не можете предсказать это, если вы не синхронизируете это. Никто не гарантирует вам, что поток будет работать до или после этого цикла while. Но если он заблокирован на 5 секунд, это нехорошо - к этому моменту поток должен быть прерван.

Кроме того, поскольку вы впервые используете wantToQuit в методе run (), никто не гарантирует, что поток запущен, когда вы проверяете его атрибут wantToQuit в while not myThread.wantToQuit.

1 голос
/ 09 февраля 2009

Поведение здесь не то, что вы описали. Посмотрите на те примеры выходных данных, которые я получил:

1-й: нажатие q<ENTER> как можно быстрее:

hey
q

2-й: немного подождать, прежде чем нажать q<ENTER>:

hey
hey
hey
q

3-й: не трогайте клавиатуру:

hey
hey
hey
hey
hey
hey
# Application locks because main thread is over but 
# there are other threads running. add myThread.wantQuit = 1
# to prevent that if you want
0 голосов
/ 09 февраля 2009

Гиперборей имеет ваш ответ. Поток все еще запускается при выполнении цикла for.

Вы хотите проверить, запущен ли поток, прежде чем переходить в ваш цикл. Вы можете упростить поток для мониторинга raw_input и возвращать его, когда вводится «q». Это убьет поток.

Вы в цикле main можете проверить, жив ли поток.

0 голосов
/ 09 февраля 2009

только что попробовал код, чтобы убедиться, но он делает то, что должен ... вы можете набрать q и войти в консоль и заставить приложение завершить работу до a = 0 (поэтому он говорит, что эй меньше 5 раз )

Я не знаю, что вы подразумеваете под диалогом raw_input, raw_input обычно просто получает информацию из stdin

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