从其他线程访问 VT 数据是否安全?

2024-03-05

从辅助线程更改 Virtual TreeView 数据是否安全? 如果是,我应该使用关键部分(甚至是同步方法)吗?

我担心当我从另一个线程写入 VT 的数据记录时,主线程同时调用其重绘,并且此刷新将导致同时读取同一记录。我想补充一下,我在应用程序中只使用了 2 个线程。

就像是 ...

type
  PSomeRecord = ^TSomeRecord;
  TSomeRecord = record
    SomeString: string;
    SomeInteger: integer;
    SomeBoolean: boolean;
end;

...
var FCriticalSection: TRTLCriticalSection; // global for both classes
...

procedure TMyCreatedThread.WriteTheTreeData;
var CurrentData: PSomeRecord;
begin
  EnterCriticalSection(FCriticalSection); // I want to protect only the record

  CurrentData := MainForm.VST.GetNodeData(MainForm.VST.TopNode);

  with CurrentData^ do // I know, the ^ is not necessary but I like it :)
    begin
      SomeString := 'Is this safe ? What if VT will want this data too ?';
      SomeInteger := 777;
      SomeBoolean := True;
    end;

  LeaveCriticalSection(FCriticalSection);

  MainForm.VST.Invalidate;
end;

// at the same time in the main thread VT needs to get text from the same data
// is it safe to do it this way ?

procedure TMainForm.VST_GetText(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
  var CellText: string);
var CurrentData: PSomeRecord;
begin
  EnterCriticalSection(FCriticalSection); // I want to protect only the record

  CurrentData := VST.GetNodeData(VST.TopNode);

  with CurrentData^ do
    begin
      case Column of
        0: CellText := SomeString;
        1: CellText := IntToStr(SomeInteger);
        2: CellText := BoolToStr(SomeBoolean);
      end;
    end;

  LeaveCriticalSection(FCriticalSection);
end;

// I'm afraid the concurrent field reading may happen only here with the private VT fields
// FNodeDataSize, FRoot and FTotalInternalDataSize, since I have Node.Data locked by the
// critical sections in the VT events, some of those may be accessed when VT is refreshed
// somehow

function TBaseVirtualTree.GetNodeData(Node: PVirtualNode): Pointer;
begin
  Assert(FNodeDataSize > 0, 'NodeDataSize not initialized.');

  if (FNodeDataSize <= 0) or (Node = nil) or (Node = FRoot) then
    Result := nil
  else
    Result := PByte(@Node.Data) + FTotalInternalDataSize;
end;

Update

我已将关键部分添加到代码中,即使该函数仅返回指向记录的指针,从 TMyCreatedThread 类调用 GetNodeData 真的不安全吗?

多谢

Regards


不,尤其是你这样做的方式。

VST是视觉控制。亦是如此MainForm,您直接从您的线程中引用它。 GUI 控件不是线程安全的,不应直接从线程访问。此外,您还引用了线程中的全局变量“MainForm”。这绝对不是线程安全的。

如果您需要访问以下数据VST来自您的主窗体和单独的线程,不要将其直接存储在VST.Node.Data。将其保存在一个外部列表中,您可以用关键部分或其他一些线程安全方法包围该列表,并在线程中访问该外部列表(首先锁定它)或在VST事件。看TLockList在 Delphi RTL 中的可锁定列表的示例,以及TMultipleReadExclusiveWrite示例同步类。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从其他线程访问 VT 数据是否安全? 的相关文章

随机推荐

  • 如何使用多个 CBCharacteristicProperties 和权限初始化 CBMutableCharacteristic

    我正在创建一个新的 CBMutableCharacteristic 以在我正在制作的蓝牙应用程序中使用 我从教程中得到了一些代码 如下所示 customCharacteristic CBMutableCharacteristic alloc
  • 如何在React项目中添加Service Worker

    我想在我的 React 项目中添加 Service Worker 项目已准备就绪 默认服务似乎不起作用 即使当我尝试导入它时 它也会出现以下错误 尝试导入错误 registerServiceWorker 不包含默认导出 导入为 regist
  • GWT 模块的模块标记中的 rename-to 是什么意思?

    GWT 模块中模块标记的 rename to 属性是什么意思 是可选的吗 它 导致编译器表现得好像模块的名称与长的 完全限定的名称不同 http code google com webtoolkit doc latest DevGuideO
  • 在 MySql 中提取具有特定模式的子字符串

    我有一个文本字段 如下所示 option A sum A g3et B 我想获取里面的文字 没有重复项 获得意义 A B 不可能出现双重like的情况 我知道这是一种在数据库中保存数据的可怕方法 我无法更改数据的保存方式 我只需要从本专栏中
  • 红宝石。合并嵌套哈希而不覆盖

    我有一个嵌套哈希 X 1 2 3 gt X O 2 3 gt X O X 3 gt X O X O 我想合并给定的嵌套哈希 X 1 2 3 gt X O 2 3 gt X O 2 X gt X O O X 这样 X 1 2 3 gt X O
  • 如何更改Windows Phone应用程序中按钮的背景颜色?

    我正在使用 C 和 silverlight 4 开发 Windows Phone 7 应用程序 我是 silverlight 的新手 我的应用程序中有两个用于不同目的的按钮 我想在单击按钮时动态更改按钮的颜色 所以我使用下面的代码 Inco
  • 办公自动化、VSTO 和 Open XML SDK 之间有什么区别?

    办公自动化 VSTO 和 Open XML SDK 之间有什么区别 我们需要所有这些还是其中一些已经过时了 办公自动化是指使用 COM 互操作以编程方式操作 Office 程序 或更常见的是通过 Office 程序操作 Office 文档
  • 默默忽略remove()

    实体 A 引用 多对一 实体 B 具有从 B 到 A 的反向 映射 引用 此外 还存在 A 到 C 的引用以及 C 到 A 的反向引用 当我发出entityManager remove A 然后flush 时 不会生成 删除 但也没有例外
  • ld:找不到 AudioUnit 框架

    我正在添加另一个项目 即使我添加了所需的所有库 我也会收到此错误 这是错误详细信息 Ld Users alialzahrani Library Developer Xcode DerivedData IMS3 ezltqoccjhjpvua
  • 如何在 React.js 中预加载图像?

    如何在 React js 中预加载图像 我有下拉选择组件 其工作方式类似于菜单 但我必须预加载项目的图像图标 因为有时它们在第一次打开时不可见 我努力了 https github com sambernard react preload h
  • 使用 xslt 从 xml 转换而来的平面文件中的行数

    下面是我用来将 xml 转换为平面文件的 xsl 它还满足各种其他所需条件
  • iOS7 深色键盘和浅色键盘之间的切换

    In iOS7 we have both a dark and a light keyboard Is it possible for me to change between these in my app by code textfie
  • 当任何包含公式的单元格发生更改时触发宏

    我有一个包含大约 50 个单元格 包含公式 的工作表 这些单元格根据外部工作簿中的单元格而变化 当这些单元格中的任何一个更改其值时 我想触发某个宏 Worksheet change 事件不起作用 并且 Worksheet Calculate
  • C# RichEditBox 性能极慢(加载 4 分钟)

    The RichEditBoxC 中的控件 我使用 VS 2005 性能较差 我将包含 45 000 行彩色文本的 2 5 MB RTF 文件加载到控件中 需要 4 分钟 我将相同的 RTF 加载到 Windows XP 写字板的 RTF
  • Python Flask 从像 render_template 这样的变量渲染文本

    我知道烧瓶功能render template 我必须给出模板的文件名 但现在我想渲染模板的字符串 即模板的内容 这就说得通了 但我现在不想解释原因 如何简单地渲染模板的文本 您可以使用render template string http
  • 什么是滑动窗口算法?例子?

    在解决几何问题时 我遇到了一种称为滑动窗口算法的方法 确实找不到任何学习材料 详细信息 该算法是关于什么的 我认为它更多的是一种技术而不是算法 这是一种可用于各种算法的技术 我认为通过以下示例可以最好地理解该技术 想象一下我们有这个数组 5
  • 更改 div 与背景图像之间的 Flex 间距

    hi i am remaking the google chrome home page but i cant seem to do the part at the bottom of the page were the most used
  • typeof 在 IE 中返回“未知”

    我有一个窗口 在关闭之前我会刷新底层页面 if opener typeof opener Refresh undefined opener Refresh 如果我离开原来的打开页面 这段代码会抛出一个 没有权限 error 调试代码发现ty
  • 如何在禁用状态下自定义 mat-form-field

    我正在尝试自定义角度材料 mat form field 我可以使用以下命令自定义下划线边框 ng deep mat form field ripple background color yellow 现在我正在尝试将禁用状态下的下划线边框自
  • 从其他线程访问 VT 数据是否安全?

    从辅助线程更改 Virtual TreeView 数据是否安全 如果是 我应该使用关键部分 甚至是同步方法 吗 我担心当我从另一个线程写入 VT 的数据记录时 主线程同时调用其重绘 并且此刷新将导致同时读取同一记录 我想补充一下 我在应用程