Я пытаюсь использовать несколько 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?
Спасибо,