我们正在开发一款控制科学测量设备的软件。它提供了一个COM接口,定义了几个函数来设置测量参数,并在测量数据时触发事件。
为了测试我们的软件,我正在实现该设备的模拟。
COM对象运行一个循环,定期触发事件。客户端应用程序中的另一个循环现在应该使用给定的函数设置COM模拟器。
我创建了一个测量参数类,当设置新的测量时将被实例化。
两个循环在独立的线程中运行。当调用server.NewMeasurement()时,服务器上的对象被设置为一个新实例。但在下一个函数中,该对象再次为空。在处理服务器事件时执行相同操作,它可以正常工作,因为该方法在服务器线程中运行。如何使其在客户端线程中也能正常工作。
由于客户端需要与真实设备配合使用,因此我不能修改制造商提供的接口。此外,我需要独立设置测量,而不是定期触发事件处理程序。
我认为这个问题与多线程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行为有关,但我在这个主题上找不到任何信息。