мы разрабатываем программное обеспечение для управления научным измерительным прибором. он предоставляет 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, но я ничего не нашел по этой теме.