При запуске кода выдает ошибку EOFError: Ran out of input
По задумке при нажатии кнопки start должен запускаться поток, выполняющий определенный цикл, а кнопка end соответственно этот поток останавливает.
Поправьте, пожалуйста, если что-то не так делаю. В многопоточности новичок. Использую встроенную библиотеку multipocessing.
Полный traceback ошибки:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "C:\Users\Bubunduc\AppData\Local\Programs\Python\Python39\lib\multiprocessing\spawn.py", line 116, in spawn_main
exitcode = _main(fd, parent_sentinel)
File "C:\Users\Bubunduc\AppData\Local\Programs\Python\Python39\lib\multiprocessing\spawn.py", line 126, in _main
self = reduction.pickle.load(from_parent)
EOFError: Ran out of input
Фрагмент кода:
def add_functionts(self):
self.btn_start.clicked.connect(self.Process)
self.btn_end.clicked.connect(self.end)
def Process(self):
self.process= multiprocessing.Process(target=self.start)
self.process.start()
def start(self):
print('start')
while True:
time.sleep(2)
print('Hi')
def end(self):
print('The end of the programm')
self.process.terminate()
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
В Qt достаточно собственных средств для работы с потоками и редко когда вам понадобятся сторонние библиотеки.
Самый простой вариант - это использовать класс QThread.
Класс QThread обеспечивает независимый от платформы способ управления потоками.
import sys
from PyQt5.Qt import *
class Thread(QThread):
signal = pyqtSignal(str)
def __init__(self):
super().__init__()
self.flag = True
self.i = 1
def run(self):
while self.flag:
self.signal.emit(f'Hi {self.i}')
self.msleep(2000)
self.i += 1
def stop(self):
self.flag = False
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.textEdit = QTextEdit()
self.btn = QPushButton('Start')
self.btn.clicked.connect(self.onClicked)
layout = QVBoxLayout(self)
layout.addWidget(self.textEdit)
layout.addWidget(self.btn)
self.thread = Thread()
self.thread.signal.connect(self.updateData)
def updateData(self, text):
self.textEdit.append(text)
def onClicked(self):
if self.btn.text() == 'Start':
self.thread.flag = True
self.thread.start()
self.btn.setText('Stop')
else:
self.thread.flag = False
self.btn.setText('Start')
if __name__ == "__main__":
app = QApplication(sys.argv)
w = MainWindow()
w.resize(500, 300)
w.show()
sys.exit(app.exec_())
