访问 List 项时 UI 和 Worker 线程同步

Posted

技术标签:

【中文标题】访问 List 项时 UI 和 Worker 线程同步【英文标题】:UI and Worker thread synchronization when accessing List item 【发布时间】:2013-10-17 02:20:30 【问题描述】:

我有一个列表,其中包含要处理的数据。而且我有 2 个线程,

UI 线程:更新/添加列表项,

线程 1:一旦将项目添加到列表中,它就会将项目一个接一个地发送到另一个线程 2,

线程 2:它是否工作并相应地更新项目,一旦完成工作,它会检查列表,如果相应的项目仍然存在于列表中,如果存在则处理数据。

在关闭窗口时从 UI 线程,我正在从地图中删除从 UI 添加的项目。这样线程 2 就不会继续从列表中删除的项目。

从 UI destruct 或者,我正在删除列表中添加的项目实例。

问题是,线程 2 已经在处理一个项目,同时窗口关闭并且析构函数删除了线程 2 正在处理的项目。

所以线程 2 对数据的处理崩溃了。

我已经在 MFC 中完成了这项工作。如何同步这 2 个线程(UI 删除和线程 2)。我知道 MFC 中有不同的线程同步方法。哪种方法最适合这种情况?

【问题讨论】:

【参考方案1】:

当你想停止操作时(也许当用户点击关闭按钮时),首先你告诉线程退出。这可以通过线程定期检查的布尔值或事件 (SetEvent) 来完成。在您告诉线程退出后,您不能删除 UI 或线程正在使用的任何数据,直到您确定线程已退出。使用 WaitForSingleObject 中的线程句柄等待线程退出。 WaitForSingleObject 挂起调用线程,直到线程句柄发出线程退出的信号。然后您可以继续删除和关闭 UI。

【讨论】:

以上是关于访问 List 项时 UI 和 Worker 线程同步的主要内容,如果未能解决你的问题,请参考以下文章

OpenHarmony stage worker 多线程

UI Thread 和运行 TCP Client 的 Worker 线程之间的持续数据传输

Web Worker 是在主 ui android 线程还是单独的线程上运行?

web worker && webSocket

MFC - 获取特定窗口的设备上下文

Web Worker