首页 > 解决方案 > 为什么 CNiButton 不能从除主线程之外的线程更改?

问题描述

我有 2 个应用程序,实际上其中两个是同一个应用程序,但它们在两台不同的计算机上工作,第一台计算机(假设 A)远程控制第二台计算机(假设 B)以控制连接到 B 的硬件。 B也可以单独控制所有硬件。

问题是软件中的CNiButton按钮如果A对B说打开就无法打开,但是当只有B在运行时,它可以触发/打开CNiButton。所以我认为这不是图书馆问题。因为它只有在B尝试打开时才能正常工作,但是,A告诉B打开,它不工作/打开。另外,B中的软件异常终止。

我无法共享代码,因为代码不可访问。无论如何我真的需要你的不同意见

  1. A电脑可以在其上运行的自己的软件上打开CNiButton,
  2. B电脑可以在自己运行的软件上打开CNiButton,

A和B电脑在一起,所以B一直听A电脑如果有来自A的数据包,B根据数据包做动作

  1. 如果 A 发送一个包含打开 CNiButton 和程序终止的数据包,则 B 无法打开 CNiButton。

这些可能是什么原因?什么会导致程序终止?

我还提供了一些关于我的系统的信息 - 有很多线程可以监听硬件 - B 包括监听 A 的线程 - 如果 A 通过 RS432 通信按下按钮 1,则 B 调用按钮 1 事件

我认为线程相互重叠,但我不明白为什么 CNiButton 会发生这种情况,而其他标准按钮不会发生这种情况。

除了主线程之外,还有什么理由不应该从另一个线程运行此按钮吗?

同时,该程序适用于 VisualC++ 6.0,并具有适用于 NI 硬件的驱动程序。

编辑1

我认为需要添加一些我记得的代码!

有一个按钮

CNiButton ledTemperature;

如果你知道 LabView,这个按钮看起来像一个 LabView led。一个线程监听 B 计算机让我们说 void listenBComputer() 方法和 MFC CMSComm 类的方法,

 CMSComm comPort;
 void MyClass:: listenBComputer();

listenBComputer() 方法调用 B 计算机,如果 B 点击例如:fireOpenButton 然后 A 做同样的事情并调用 fireOpenButton 的方法,假装像一台计算机点击 fireOpenButton 并且必须打开“ledTemperature”CNiButton 一样,

ledTemperature.SetValue(true) ;

当 B 计算机向 A 发送命令时,此操作不起作用并抛出异常,但相同的代码和过程或我们所说的任何内容如果 A 在没有 B 计算机的情况下单击 fireOpenButton 则正常工作。

标签: multithreadingvisual-c++mfclabviewled

解决方案


推荐阅读