从GUI程序连续写入串行链接:需要使用线程吗?

2024-06-25 23:38:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我用PyQt4编写了一个GUI程序,它必须通过串行数据链路发送消息字符串。在

我用两个按钮小部件实现了一个GUI界面。我需要通过串行链接连续发送数据,当第一个按钮被单击时每秒一次,然后在第二个按钮被单击时停止。在

我当前的程序只能在点击按钮的瞬间发送数据。这是我写的处理按钮点击信号的方法:

def sendMessage(self):
    while 1:
        print "Hello........"
        if checke == False:
            break

我需要使用线程来解决这个问题吗?在


Tags: 方法字符串程序消息界面信号链接部件
3条回答

要看情况。。。如果发送操作很快,可以使用QTimer类。它与Qt事件循环集成,因此您不必担心线程问题。串行通信可能会很慢,这取决于您发送的数据量,所以我不能确定这是否是适合您的解决方案。在

是的,你需要使用线程。在任何基于GUI的程序中,任何需要花费大量时间的工作都应该在单独的线程上进行,以避免在看到“无响应”程序时阻塞UI,这几乎总是由于程序无法处理窗口消息,因为它的UI线程在一些长时间操作中被阻塞。在

启动后台线程的一个简单方法是使用^{} module。下面是如何使用它每秒向串行端口写入一次数据:

class MyClass:
    # This method will run on a separate thread
    def _serial_port_worker(self):
        while self._run_worker:
            self.send_data_to_serial_port()
            time.sleep(1)

    # Call this to start the worker thread
    def start_worker_thread(self):
        self._run_worker = True
        worker_thread = threading.Thread(target=self._serial_port_worker,
                                         args=(self,))
        worker_thread.start()

    # Call this to tell the worker thread to stop
    def stop_worker_thread(self):
        self._run_worker = False

是的。GUI编程的关键是永远不要在主线程上执行任何长操作,因为它会阻塞整个程序,直到该操作完成为止。在

若您想通过网络连续发送数据,请在后台线程中执行。在

为您提供一些示例代码。在

class MessageWorker(QtCore.QThread):

    def __init__(self):
        super(ParserWorker, self).__init__()
        self.ok_to_send = False
        self.terminated = True

    def run(self):
        while not self.terminated:
            if self.ok_to_send:
                self.send_message()
            time.sleep(1)

     def start_send():
         self.ok_to_send = True

     def pause_send():
         self.ok_to_send = False

     def terminated():
         self.terminated = False

然后在主程序中调用

^{pr2}$

相关问题 更多 >