Вызов dll асинхронно - PullRequest
       9

Вызов dll асинхронно

0 голосов
/ 11 января 2011

Я надеюсь, что вы можете следовать этому.Вопрос в конце.

У меня есть книга Excel 2003, которая содержит таблицу значений, которые будут использоваться в DOE (Дизайн экспериментов).Этот лист загружает (через Workbook.Open) другую рабочую книгу, заполняет правильные поля и затем выполняет вычисления во второй рабочей книге (через Application.Run("backend.xla!calc")).

В свою очередь, вычисление вызывает внешний .dll (скомпилированный Fortan ) и ожидает его завершения (через Declare Sub Calculate Lib "fortran.dll" (args)).Каждый прогон занимает 4 минуты.Может быть от 7 до 21 пробега на DOE.В конце ключевые значения возвращаются в первую рабочую книгу для отображения результатов.

Пожалуйста, помогите мне придумать, как создать несколько копий второй рабочей книги и рассчитать каждую из них (вызывая одну и ту же DLL,различные параметры) в одно и то же время (другой процесс Excel) для лучшего выделения 4-ядерных процессоров.

Или, может быть, какой-либо способ прямого вызова внешней функции асинхронно.Я понимаю, что Excel 2003 VBA является однопоточным, и внешняя DLL может использоваться только как синглтон (я не уверен).

PS.Не стесняйтесь говорить, что я в значительной степени привязан к последовательным вычислениям стиля.Хорошо, я могу взять это.

1 Ответ

0 голосов
/ 12 января 2011

Это быстро и грязно, но вы должны понять.Идея состоит в том, чтобы создавать совершенно новые процессы Excel и открывать рабочую книгу из каждого нового процесса:

Sub MakeNewProcess()
Dim xl As Application

    Set xl = New Application
    xl.Visible = True
    MsgBox "Check task manager and you'll see (at least) two EXCEL.EXE processes"
End Sub

Я добавил окно сообщения, потому что после нажатия кнопки «ОК» в окне сообщения переменная xl выходит за рамкиновый процесс автоматически убивается.Если вы запустите свой метод Workbooks.Open из этой переменной (т. Е. xl.Workbooks.Open), он должен получить вас там, где вы хотите.

...