Таблица бегущих объектов - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь использовать несколько COM-объектов Matlab для распараллеливания вычислений (я действительно не ограничен в токенах лицензий).

Из-за того, что я не знаю почему, прогиды, связанные сGUID не указываются в установках (как "Matlab.Application"), поэтому метод GetObject () ничего не возвращает.

Поэтому для извлечения COM-объекта я обычно использую таблицу идущих объектов (ROT) ивосстановить первый найденный.

На этот раз я пытаюсь получить более одного COM-объекта, используя следующую функцию:

Private Function GetCOMFromTable(Of T)() As List(Of T)

    Try
        Dim ReturnCOMList As New List(Of T)
        Dim RunningObjectTable As IRunningObjectTable
        Dim MonikerEnumerator As IEnumMoniker = Nothing
        Dim Monikers(1) As IMoniker

        RunningObjectTable = GetRunningObjectTable(0)
        RunningObjectTable.EnumRunning(MonikerEnumerator)
        MonikerEnumerator.Reset()

        Dim NumFetched As New IntPtr()
        While MonikerEnumerator.Next(1, Monikers, NumFetched) = 0
            Dim RunningObjectIns As Object = Nothing
            RunningObjectTable.GetObject(Monikers(0), RunningObjectIns)
            If TypeOf RunningObjectIns Is T Then ReturnCOMList.Add(DirectCast(RunningObjectIns, T))
        End While

        Return ReturnCOMList

    Catch Exc As Exception
        Throw Exc
    End Try

End Function

Вот моя проблема:

Длякаждый процесс Matlab запущен, три объекта COM зарегистрированы в ROT.Поэтому я предположил, что это один и тот же COM-объект, зарегистрированный три раза.

Итак, скажем, если мне нужны три Matlab, я запускаю три процесса Matlab и получаю девять COM-объектов.Чтобы сохранить только три из них, я использую следующую функцию:

Private Function SelectMatlabs(ByRef Matlabs As List(Of DIMLApp)) As List(Of DIMLApp)

    Dim SelectedMatlabs As New List(Of DIMLApp)
    Dim SelectingHashet As New HashSet(Of Integer)
    For i = 1 To Matlabs.Count
        Matlabs(i - 1).Execute("a=" & i)
    Next
    For Each Matlab In Matlabs
        If SelectingHashet.Add(Matlab.GetVariable("a", "base")) Then SelectedMatlabs.Add(Matlab)
    Next

    Return SelectedMatlabs

End Function

Но эта функция извлекает только один COM-объект.Первый из списка.Когда я вручную пытаюсь получить переменную 'a' в Matlab, об этом знает только первый исполнитель, и он возвращает 9.

Кажется, что все девять COM-объектов связаны с первым запущенным процессом Matlab.

Это ожидаемое поведение?Что-то не так в способе перебирать объекты в ROT?

Спасибо,

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