Как правильно завершить QThread из приложения с графическим интерфейсом? - PullRequest
3 голосов
/ 28 октября 2011

Я пытался использовать self.terminate() в классе QThread, а также self.thread.terminate() в классе GUI. Я также попытался поставить self.wait() в обоих случаях. Тем не менее, есть два сценария:

1) Поток вообще не завершается, а графический интерфейс останавливается в ожидании завершения потока. После завершения потока графический интерфейс размораживается, и все возвращается в нормальное состояние.

2) Поток действительно завершается, но в то же время замораживает все приложение.

Я также пытался использовать self.thread.exit(). Радости нет.

Чтобы уточнить, я пытаюсь реализовать кнопку прерывания пользователя в GUI, которая прервала бы выполнение потока в любой момент времени.

Заранее спасибо.

EDIT:

Вот метод run():

def run(self):
    if self.create:
        print "calling create f"
        self.emit(SIGNAL("disableCreate(bool)"))
        self.create(self.password, self.email)
        self.stop()            
        self.emit(SIGNAL("finished(bool)"), self.completed)

def stop(self):
     #Tried the following, one by one (and all together too, I was desperate):
     self.terminate()
     self.quit()
     self.exit()
     self.stopped = True
     self.terminated = True
     #Neither works

А вот метод класса GUI для прерывания потока:

def on_abort_clicked(self):
     self.thread = threadmodule.Thread()
     #Tried the following, also one by one and altogether:
     self.thread.exit()
     self.thread.wait()
     self.thread.quit()
     self.thread.terminate()
     #Again, none work

1 Ответ

5 голосов
/ 28 октября 2011

Из документации Qt для QThread :: terminate:

Предупреждение : эта функция опасна и ее использование не рекомендуется.Поток может быть прерван в любой точке пути кода.Потоки могут быть прерваны при изменении данных.У потока нет никаких шансов очистить после себя, разблокировать любые удерживаемые мьютексы и т. Д. Короче говоря, используйте эту функцию только в случае крайней необходимости.

Вероятно, гораздо лучше переосмыслитьВаша стратегия потоков такова, что вы можете, например, использовать QThread :: quit (), чтобы сигнализировать потоку о корректном завершении работы, вместо того, чтобы пытаться завершить поток таким образом.На самом деле вызов thread.exit () из потока должен делать это в зависимости от того, как вы реализовали run ().Если вы хотите поделиться кодом для вашего метода запуска потока, который может подсказать, почему он не работает.

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