从多个线程访问对话框项(C ++)

时间:2011-05-25 07:26:18

标签: multithreading dialog controls mutex

我有一个带有一些复选框控件的对话框。

此对话框可以创建一个工作线程,该线程能够在其运行时访问其中一些控制项。

但是,当工作线程运行时,用户也可以修改这些复选框控件项。

尽管不太可能,但是当用户想要更改它们时,线程会尝试读取其中一些项目。

如何保护主线程和工作线程之间的并发访问对话框项?

我想我应该创建一个互斥锁,并且很容易从工作线程中使用这个互斥锁,但是当用户想要更改时,我看不到在哪里可以插入用于锁定具有相同互斥锁的对话框项的代码它

有人可以帮助我吗?

提前致谢。
银杏

1 个答案:

答案 0 :(得分:0)

你还没有说明你正在使用哪个平台,所以我将假设无论它是什么平台,它都遵循通用规则,即只有UI线程才能访问UI控件。有了这个规则,你有明显的推论,其他线程无法直接读取复选框状态。

解决方案如下:

  1. 创建一些与表示对话框的对象中的复选框对应的私有布尔字段。
  2. 每当用户修改复选框时,请更新相应的布尔字段。
  3. 将这些字段公开为只读属性以供其他线程读取。
  4. (可选)使用互斥锁保护对布尔字段的所有访问。
  5. 第4项是可选的,因为在所有架构上我都知道在访问布尔字段时没有撕裂的危险。

    这一点的重点是避免读写UI控件状态不是线程安全的问题。但是在整体设计中,你概述了你永远不会没有数据竞争。当您的工作线程读取状态时,用户可能刚刚更改了它,或者可能即将更改它。您无法知道,一旦您允许工作线程与UI线程并行运行,您必须接受这一事实。