2013-09-18 3 views
0

Я пытаюсь понять, как сделать Qthread, и у меня есть этот скелетный код. моя главная цель - не позволить графическому интерфейсу «зависать», в то время как бэкэнд выполняет некоторые работы с базой данных и одновременно обновляет виджет таблицы в графическом интерфейсе. background: Выполнение этого в ОС Windows. Pyside как графический интерфейс. (Я также пытался Python многопоточность, но каждый раз, когда мои приложения аварии)Помощь для понимания Qthread и сигналов. (Pyside)

class GenericThread(QtCore.QThread): 
    def __init__(self, function, *args, **kwargs): 
     QtCore.QThread.__init__(self) 
     self.function = function 
     self.args = args 
     self.kwargs = kwargs 

    def __del__(self): 
     self.wait() 

    def run(self): 
     self.function(*self.args,**self.kwargs) 
     return 

clas myMainGUI(...) 
    def add(self): 
     ... 
     for myfiles in os.listdir(..): <--- intensive process, lots of files 
      column headers = [ .... ] 
      result = select_data_from_file(myfiles) <----- database file processing 
      self.insert_table_widget (column headers, result) <--want to insert to widge in "realtime" and do other stuff without GUI getting "hang" 
      .... 
      self.mythread.emit() <-- ?? 

    def coolie(self): # some button will call this function. 
     if buttonclick == "add": 
      self.mythread = GenericThread(self.add) 
      self.mythread.disconnect() <------?? 
      self.mythread.connect() <------ ?? 
      self.mythread.start() 

любая идея, как следует мой Испустите(), подключение() или отключить() быть? спасибо

+0

Do * not * реализовать '__del__', если вы точно не знаете, что делаете. В этом случае я считаю, что ваша реализация '__del__' может вызвать утечку памяти (если не другие проблемы). – Bakuriu

ответ

0

Я предлагаю против использования потоков параллельно с вашим графическим интерфейсом, если вы не используете какой-либо ввод-вывод или библиотеку, в которой вы используете релизы GIL. Они просто замедлят ситуацию.

Либо придерживайтесь последовательного подхода, все будет сделано быстрее, чем ваша текущая реализация (в моем приложении я чуть ли не увеличился в 2 раза быстрее, используя потоки). И следуйте подсказкам ускорения питона, например here.

В противном случае вы могли бы использовать модуль multiprocessing.

Смежные вопросы