跨线程更新观察者模式(非阻塞)

2024-09-30 01:22:58 发布

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

初来乍到,请原谅任何礼节上的错误(如有请指出!)。在

我正在编写一个在程序主UI线程上运行的脚本。也就是说,我需要避免所有阻塞调用,以确保用户仍然可以交互。我没有访问UI事件循环的权限,因此在我的情况下,任何繁忙的循环解决方案都不可能。在

我有一个简单的后台线程,它与另一个应用程序通信并收集数据,并存储在一个简单的数组中以供使用。每次更新此数据时,我都需要使用数据来修改UI(这必须在主线程中运行)。理想情况下,每次更新数据时,后台线程都会发出一个信号,然后在主线程中,侦听器将处理该信号并修改UI。繁忙的循环不是一个选项所有东西都必须是异步的/基于事件的。在

我有数据收集连续运行在后台使用线程.计时器(..). 但是,由于这是在一个单独的线程中运行的,因此需要在外部调用UI操作。在

def _pollLoop(self): 
    if (self._isCubeControl):
        self._getNewData()
        #in a perfect world, updateUI() would be here
        self._pollThread = threading.Timer(0.1,self._pollLoop)
        self._pollThread.start()

我需要一种方法让这个pollLoop回调到主线程,这样我就可以更新UI了。我尝试过在pollLoop中直接回调,但是回调是在单独的线程中运行的,这会导致错误。在

以使侦听器能够附加一个update线程,以便在该线程上附加数据。在

谢谢你的帮助!如果这是模糊的,请告诉我

更新

正在尝试实现基于观察者的模式。困难在于,Observable要在派生线程中运行,而observate更新函数必须在主线程中运行。我已经实现了示例chad lung(http://www.giantflyingsaucer.com/blog/?p=5117)。在

^{pr2}$

我得到的回应是:

<_MainThread(MainThread, started 140735179829248)>
<_Timer(Thread-1, started 123145306509312)>
<_Timer(Thread-2, started 123145310715904)>

所以很明显观察者是在派生线程中运行的,而不是main。有人能给我另一个方法吗?:)再一次,我不能有一个繁忙的循环来定期检查值的更改(我希望。。:()此脚本正在UI上方运行,我没有访问GUI事件循环的权限,因此所有操作都必须是异步和非阻塞的。在


Tags: 数据self脚本权限ui信号错误事件
1条回答
网友
1楼 · 发布于 2024-09-30 01:22:58

让我们以http://www.giantflyingsaucer.com/blog/?p=5117中的示例为基础。在

from abc import ABCMeta, abstractmethod

class Observer(object):
    __metaclass__ = ABCMeta

    @abstractmethod
    def update(self, *args, **kwargs):
        pass

然后由观察者实现来断开线程的连接。假设我们使用了一个简单的线程来完成这个任务。(语法可能不正常,我正在把这东西塞满,需要赶公共汽车)。在

^{pr2}$

相关问题 更多 >

    热门问题