【发布时间】:2011-03-02 17:46:16
【问题描述】:
我们正在开发一种软件来控制科学测量设备。它提供了一个 COM 接口,定义了几个函数来设置测量参数并在测量数据时触发一个事件。
为了测试我们的软件,我正在实现该设备的模拟。
com-object 运行一个循环,周期性地触发事件。客户端应用程序中的另一个循环现在应该使用给定的函数设置 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 行为有关,但我没有找到关于这个主题的任何内容。
【问题讨论】:
标签: c# multithreading com