我们正在开发一种软件来控制科学测量设备。它提供了一个 COM 接口,定义了几个函数来设置测量参数并在测量数据时触发事件。
为了测试我们的软件,我正在实现该设备的模拟。
com 对象运行一个循环,定期触发事件。客户端应用程序中的另一个循环现在应该使用给定的函数设置 com 模拟器。
我创建了一个用于测量参数的类,该类将在设置新测量时实例化。
// COM-Object
public class MeasurementParams
{
public double Param1;
public double Param2;
}
public class COM_Sim : ICOMDevice
{
public MeasurementParams newMeasurement;
IClient client;
public int NewMeasurement()
{
newMeasurment = new MeasurementParam();
}
public int SetParam1(double val)
{
// why is newMeasurement null when method is called from client loop
newMeasurement.Param1 = val;
}
void loop()
{
while(true)
{
// fire event
client.HandleEvent;
}
}
}
public class Client : IClient
{
ICOMDevice server;
public int HandleEvent()
{
// handle this event
server.NewMeasurement();
server.SetParam1(0.0);
}
void loop()
{
while(true)
{
// do some stuff...
server.NewMeasurement();
server.SetParam1(0.0);
}
}
}
两个循环都在独立的线程中运行。当调用 server.NewMeasurement() 时,服务器上的对象被设置为一个新实例。但在下一个函数中,该对象再次为空。在处理服务器事件时执行相同的操作,它工作得很好,因为该方法在服务器线程中运行。如何让它也从客户端线程工作。
由于客户端是要使用真实设备的,所以我无法修改制造商提供的接口。我还需要设置独立于事件处理程序的测量,该事件处理程序不会定期触发。
我认为这个问题与多线程 COM 行为有关,但我在这个主题上没有发现任何内容。
客户端和服务器的线程模型是什么 - STA 还是 MTA? (仅供参考 - STA 是单线程 Com 对象,意味着一次只能从一个线程访问其公共方法,而 MTA 是多线程对象,允许从多个线程并发访问其公共方法)
每个实例有多少个实例以及如何创建这些实例?我怀疑你只想要一个,但最终却得到了多个。
您有多少个线程以及哪个方法在哪个线程上运行?如何创建这些线程以及它们是否被初始化为运行 STA 对象或 MTA?
Note:.NET 足够智能,可以检测客户端和服务器是否都受到管理,并将 COM 排除在外。因此,您的模拟正在运行纯托管代码。如果您想要正确的测试客户端,您需要将其编写为 C++(因为我怀疑您的设备控制器是非托管代码)。
有关 COM 线程模型的参考文档:
了解和使用 COM 线程模型 http://msdn.microsoft.com/en-us/library/ms809971.aspx
进程、线程和单元 http://msdn.microsoft.com/en-us/library/ms693344(VS.85).aspx
COM 互操作简介 http://msdn.microsoft.com/en-us/library/kew41ycz(VS.71).aspx
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)