![](/img/trans.png)
[英]Good approach for updating the GUI continuously in wxPython using threads?
[英]Writing to a serial link continuously from a GUI program: need to use threads?
我用PyQt4编写了一个GUI程序,它必须通过串行数据链接发送消息字符串。
我已经实现了一个带有两个按钮小部件的GUI界面。 我需要通过串行链接连续发送数据,单击第一个按钮时每秒一次,然后在单击第二个按钮时停止。
我当前的程序只能在单击按钮的瞬间发送数据。 这是我写的处理按钮点击信号的方法:
def sendMessage(self):
while 1:
print "Hello........"
if checke == False:
break
我是否需要使用线程来解决这个问题?
是。 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
这取决于...如果发送操作很快,您可以使用QTimer类。 它与Qt事件循环集成,因此您不必担心线程问题。 串行通信速度很慢,具体取决于您发送的数据量,因此我无法确定这是否适合您。
是的,你需要使用线程。 在任何基于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
基本上你有三个选择:
pyserial
,在Serial
对象中配置超时),否则您的应用可能会无响应。 multiprocessing
模块从第二个程序进行串行通信。 即使第二个进程阻塞,也不会影响GUI。 您可以使用multiprocessing.Queue
在QUI和其他进程之间进行通信。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.