0

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

我已经实现了一个带有两个按钮小部件的 GUI 界面。我需要通过串行链路连续发送数据,单击第一个按钮时每秒一次,然后单击第二个按钮时停止。

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

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

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

4

4 回答 4

1

是的。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

然后在主程序中调用

worker = MessageWorker()
worker.start() # Start the background thread
worker.start_send() # Start sending message
worker.pause_send() # Pause sending message
worker.terminated() # Stop sending message permanently
于 2013-03-30T03:28:17.733 回答
1

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

于 2013-03-30T04:40:30.500 回答
0

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

启动后台线程的一种简单方法是使用threading模块。以下是您如何使用它每秒将数据写入串行端口一次:

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
于 2013-03-30T04:28:54.103 回答
0

基本上你有三个选择:

  • 使用第二个线程进行串行通信。GUI 工具包并不总是线程安全的,因此您应该只从主线程调用它们。此外,Python 中的线程有一个限制;一次只能有一个线程执行 Python 字节码。
  • 使用 GUI 工具包的超时功能(可能会以不同的方式调用)不时地创建一个事件。在事件处理程序中执行串行通信。确保您使用非阻塞读写(在 中pyserial,在对象中配置超时Serial),否则您的应用可能会变得无响应。
  • multiprocessing使用模块从第二个程序进行串行通信。即使第二个进程阻塞,也不会影响 GUI。您可以使用multiprocessing.QueueQUI 与其他进程之间进行通信。
于 2013-03-30T08:43:52.180 回答