В Excel 2003 может ли пользовательская функция в XLL использовать несколько потоков?

FYI 1: UDF = функция, определяемая пользователем (рабочий лист) FYI 2: XLL = надстройка Excel (DLL -> XLL)

Я пишу надстройку XLL для Excel на C/C++, используя API Excel4() от Microsoft.
Ссылка: http://msdn.microsoft.com/en-us/library/bb687835.aspx

У меня есть «сложная» задача, и я хочу использовать несколько потоков для повышения производительности. Хотя я понимаю, что вычисления в Excel 2003 являются однопоточными, я хочу знать, может ли мой UDF (а) порождать потоки для выполнения работы, (б) ждать завершения потоков и (в) возвращать результат.

Чтобы быть предельно ясным, я не буду ни автоматизировать Excel, ни вызывать Excel4() в потоках.

Псевдокод:

Variant MyComplexUDF(Variant input1, Variant input2)
{
    Thread t1 = new WorkerThread(input1);
    Thread t2 = new WorkerThread(input2);
    t1.join();
    t2.join();
    return [t1.Result(), t2.Result()];
}

На первый взгляд все выглядит нормально, но я не эксперт по библиотекам DLL/XLL и многопоточности.

P.S. Я искал Google (высокий и низкий) для этого ответа и ничего не нашел по этому вопросу.


person kevinarpe    schedule 22.05.2012    source источник
comment
Я не знаю ответа: это может зависеть от того, что фреймворк XL 2003 C API сам по себе является потокобезопасным. Возможно, вам следует разрабатывать с использованием фреймворка 2007/2012. Вы, вероятно, просто придется попробовать и посмотреть!   -  person Charles Williams    schedule 22.05.2012


Ответы (1)


Вы можете запустить столько потоков, сколько хотите, а затем ждать их. В последней версии API также есть поддержка асинхронных UDF. Некоторые примеры можно найти на странице http://xll.codeplex.com. Взгляните на test/async.cpp: http://xll.codeplex.com/SourceControl/changeset/view/14528#139508

person Keith A. Lewis    schedule 27.05.2012