我有一个应用程序(实际上是另一个应用程序的插件),它管理与外部传感器设备通信的线程。外部传感器将事件发送到应用程序,但应用程序也可以向传感器发送动作。有几种类型的设备,每种设备都具有需要特殊编码的独特品质(温度,压力等)。与传感器设备的所有通信都是通过IP进行的。
在应用程序中,我为传感器的每个实例创建一个线程。这是代码的示例
self.phThreadDict[phDevId] = tempsensor(self, phDevId, phIpAddr, phIpPort, phSerial, self.triggerDict)
self.phThreadDict[phDevId].start()
在每个线程中,我为传感器发送的事件设置了回调处理程序,然后在最后进入循环。
while not self.shutdown:
self.plugin.sleep(0.5)
线程然后处理传入事件并调用主线程或产生主线程的实际程序。所有这些都很有效。
但是,有时我还需要向特定传感器发送请求。为此目的在每个线程中定义方法,我从主线程调用这些方法。例如:
self.phThreadDict[dev.id].writeDigitalOutput(textLine, lcdMessage)
这也有效,但我相信代码实际上是在主线程中执行的,而不是在特定于传感器的线程中执行的。
我的问题是:将工作传递给特定目标线程并让线程执行工作然后返回成功或失败,我有什么选择?
答案 0 :(得分:3)
对托马斯·奥罗斯科(Thomas Orozco)的现场评论进行了扩展,
self.phThreadDict[dev.id].writeDigitalOutput(textLine, lcdMessage)
在任何运行它的线程中执行。如果你从主线程运行,那么主线程将完成所有操作。如果来自其他一些线程,那么该线程将运行它。
除了每个线程Queue
之外,对于接收要处理的工作项描述的线程,您还需要一个Queue
个线程把结果放在上面(你也可以为每个线程使用另一个Queue
,但这样做太过分了。)
主线程将从后者Queue
中拉出结果。请注意,您可以 - 并且这样做很常见 - 将元组放在Queues
上。因此,例如,在回调主线程Queue
线程上可能会出现以下形式的元组:
(result, my_thread_id, original_work_description)
这足以弄清楚哪个线程返回了响应哪个工作项的结果。也许你并不需要所有这些。也许你还需要更多。无法猜测; - )
答案 1 :(得分:2)
实际上,这是在主线程中执行代码。
Use queues,这就是他们的意思(任务同步和线程之间的消息传递)。
每个传感器管理器线程使用一个队列。
您需要做的就是定义一种消息格式,让主线程告诉管理器线程执行哪些函数以及使用哪些参数。