Tôi có pyqtmain.py sau:PyQt4: Làm thế nào để tạm dừng một chủ đề cho đến khi một tín hiệu được phát ra?
#!/usr/bin/python3
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from pyqtMeasThread import *
class MainWindow(QMainWindow):
def __init__(self, parent=None):
self.qt_app = QApplication(sys.argv)
QMainWindow.__init__(self, parent)
buttonWidget = QWidget()
rsltLabel = QLabel("Result:")
self.rsltFiled = QLineEdit()
self.buttonStart = QPushButton("Start")
verticalLayout = QVBoxLayout(buttonWidget)
verticalLayout.addWidget(rsltLabel)
verticalLayout.addWidget(self.rsltFiled)
verticalLayout.addWidget(self.buttonStart)
butDW = QDockWidget("Control", self)
butDW.setWidget(buttonWidget)
self.addDockWidget(Qt.LeftDockWidgetArea, butDW)
self.mthread = QThread() # New thread to run the Measurement Engine
self.worker = MeasurementEngine() # Measurement Engine Object
self.worker.moveToThread(self.mthread)
self.mthread.finished.connect(self.worker.deleteLater) # Cleanup after thread finished
self.worker.measure_msg.connect(self.showRslt)
self.buttonStart.clicked.connect(self.worker.run)
# Everything configured, start the worker thread.
self.mthread.start()
def run(self):
""" Show the window and start the event loop """
self.show()
self.qt_app.exec_() # Start event loop
@pyqtSlot(str)
def showRslt(self, mystr):
self.rsltFiled.setText(mystr)
def main():
win = MainWindow()
win.run()
if __name__ == '__main__':
main()
Và một kịch bản chủ đề thực hiện đo thực tế:
from PyQt4.QtCore import *
import time
class MeasurementEngine(QObject):
measure_msg = pyqtSignal(str)
def __init__(self):
QObject.__init__(self) # Don't forget to call base class constructor
@pyqtSlot()
def run(self):
self.measure_msg.emit('phase1')
time.sleep(2) # here I would like to make it as an interrupt
self.measure_msg.emit('phase2')
gì mã này làm bây giờ là sau khi nút Start được nhấn, các chức năng chạy trong chuỗi sẽ được thực thi. Tuy nhiên, thực tế trong hàm chạy, có hai pha của phép đo. Ngay bây giờ tôi đã sử dụng thời gian trễ.
Nhưng những gì tôi muốn thực hiện thực sự là sau khi đo 'phase1' được thực hiện. Một hộp thông báo sẽ xuất hiện và đồng thời, chuỗi sẽ bị tạm dừng/giữ. Cho đến khi người dùng đóng hộp tin nhắn, sau đó chức năng chủ đề sẽ được tiếp tục.