C # COM Cross Thread - PullRequest
       31

C # COM Cross Thread

3 голосов
/ 11 июня 2010

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

Ответы [ 2 ]

1 голос
/ 11 июня 2010

Какая модель потоков у клиента и сервера - STA или MTA?(Для справки: STA - это однопоточные объекты Com, предназначенные для предоставления доступа к их общедоступным методам только из одного потока за раз, а MTA - многопоточные объекты, которые обеспечивают параллельный доступ к их общедоступным методам из нескольких потоков)

Сколько у вас есть экземпляров каждого из них и как вы их создаете?Я подозреваю, что вы хотите только один, но вместо этого вы получите несколько.

Сколько потоков у вас и какой метод работает в каком потоке?Как вы создаете эти потоки и инициализируются ли они для запуска объектов STA или MTA?

Примечание: .NET достаточно умен, чтобы определить, управляются ли клиент и сервер и будет ли онCOM из картинки.Итак, ваша симуляция запускает чистый управляемый код.Если вам нужен правильный тестовый клиент, вам нужно написать его как C ++ (так как я подозреваю, что ваш контроллер устройства является неуправляемым кодом).

Справочная документация о моделях потоков COM:

Пониманиеи использование потоковых моделей COM
Процессы, потоки и приложения
Введение в COM Interop

1 голос
/ 11 июня 2010

В размещенном вами коде COM_Sim.client никогда не назначается. Чего-то не хватает? Трудно диагностировать, не видя, как объекты назначаются.

Дополнительно: в настоящее время newMeasurement объявлено как открытое поле в COM_Sim, но newMeasurment (пишется по-другому) внутри метода. Как написано, этот код не будет компилироваться. Возможно, в вашем реальном методе существует аналогичная опечатка, из-за которой вы назначаете объект, отличный от того, который, как вы думали, вы создали внутри NewMeasurement.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...