访问 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 线程同步的主要内容,如果未能解决你的问题,请参考以下文章
UI Thread 和运行 TCP Client 的 Worker 线程之间的持续数据传输