两个线程(COM和WPF UI)访问同一个浮点

本文关键字:UI 访问 同一个 WPF COM 两个 线程 | 更新日期: 2023-09-27 18:26:40

上下文

WPF UI具有使用COM和DirectShow.NET的用户控件。WPF UI显示用于转换视频帧的时间。

我在WPF UI中声明了一个浮点值。浮点值是通过引用传递给我的COM筛选器的。每次变换帧时,COM过滤器都会增加浮点值。

计时器用于每隔x毫秒在屏幕上显示浮动。

此外,请记住,每秒修改多个帧,这意味着浮点值每秒写入多次。这就是为什么我决定不使用事件,而是使用参考浮动。

问题

同一个浮点被两个不同的线程读取和写入,这会导致崩溃。读取计时器越快,崩溃发生的速度就越快。。。原因显而易见。

问题

我需要以某种方式将浮子锁定在两个线程中吗?如果是,如何?

如果可能的话,我希望将float保持为一个简单的变量,而不是将其作为属性,也不是使其成为类成员。(否则它需要在我的COM中进行多次更改,但如果这是唯一的方法,我会这样做。)

PS:我读过多线程COMObject和UI线程(C#),但不理解它,也不确定它是否适用于我的情况。

两个线程(COM和WPF UI)访问同一个浮点

Luaan在评论中表示,

另外,不要忘记.NET可以移动内存中的对象。您传递的地址不一定仍然指向浮点值。事实上,对于新创建的对象,几乎可以保证它们将进行下一次堆压缩。

这让我意识到,在一个漫长的过程中,通过引用将变量从C#传递到C++COM是错误的。

我没有在很长的过程中(大约一分钟)通过引用发送变量,而是用通过引用传递的变量每秒调用该方法,以获得值的样本。

此外,COM会将所有值写入一个文件。所以我可以在最后计算出确切的和。

这样做消除了写入已通过堆压缩移动的浮点的COM错误。