Форум сайта python.su
Здравствуйте дорогие форумчане.
У меня следующая проблема мне нужно по нажатию кнопки стартовать и останавливать процесс в котором цикл while.
В связи с этим вопрос как мне передать значение флага в процесс вот мой код но он не работает.(
import multiprocessing from PyQt4 import QtCore, QtGui, uic import sys class Work_Proc(multiprocessing.Process): def __init__(self): multiprocessing.Process.__init__(self) self.flag = False def run(self): while self.flag: print(2) class Widget(QtGui.QWidget): def __init__(self): QtGui.QWidget.__init__(self) uic.loadUi('untitled.ui', self) self.connect(self.pushButton, QtCore.SIGNAL('clicked()'), self.start) def start(self): work.flag = True if __name__ == "__main__": app = QtGui.QApplication([]) work = Work_Proc() work.start() window=Widget() window.show() if __name__ == '__main__': if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'): QtGui.QApplication.instance().exec_()
Офлайн
в мультипроцессингое для обмена используются Pipe или Queue
[code python][/code]
Офлайн
А подскажите как мне это приспособить к моему коду ?? Я знаю про pipe еще я использовал в другом приложении sharedmemory. Но как мне использовать это в моем коде я не могу понять. И мне очень важно быстродействие. То есть в отдельно процессе у меня будет идти опрос устройства которое непрерывно шлет данные и в момент нажатия мне нужно закончить этот опрос и перейти к другой функции которая будет выполнятся в этом же процессе.
Офлайн
ХЗ наколько это правильно, но както так работает:
# from multiprocessing import Process, Pipe from PyQt4 import QtGui class Work_Proc(Process): def __init__(self, pipe): Process.__init__(self) self.pipe = pipe def run(self): file = open('output.log', 'w') file.write('porcess started\n') while True: # бесконечный цикл if self.pipe.poll(): # Проверяем есть ли чтото в трубе, если есть: if self.pipe.recv() == 'stop': # Читаем что там, если пршло слово "stop" Прерываем цикл file.write('stop working.\n') break # Тут какаято работа внутри бесконечного цикла file.write('I`m working....\n') # Тут работа после прерывания цикла, например вызов другой процедуры file.write('Other work runing....\n') file.close() return class Widget(QtGui.QWidget): def __init__(self, pipe): QtGui.QWidget.__init__(self) self.pipe = pipe layout = QtGui.QVBoxLayout(self) self.pushButton= QtGui.QPushButton('stop', self) self.pushButton.clicked.connect(self.stop) layout.addWidget(self.pushButton) def stop(self): self.pipe.send('stop') # Послаем в "трубу" слово стоп if __name__ == "__main__": app = QtGui.QApplication([]) end1_pipe, end2_pipe = Pipe() # Создаем "трубу" window=Widget(end2_pipe) # Один конец "трубы" перелаем виджету window.show() work = Work_Proc(end1_pipe) # второй конец "трубы" передаем процессу work.start() # Запускаем процесс app.exec_()
[code python][/code]
Отредактировано PEHDOM (Март 6, 2018 17:35:24)
Офлайн