Автоматизация Office зависает с Windows 7 и Office 2007

excel multithreading delphi automation

163 просмотра

1 ответ

У меня есть программа Delphi XE8, в которой я использую Office Automation для создания файла Excel. Сборка занимает несколько секунд, поэтому я поместил эту работу в фоновый поток, чтобы моя программа оставалась отзывчивой, и я мог обработать запрос на отмену.

Я настроил это так:

TTask.Run(
  procedure
  var
    oXL, oSheet, o2Sheet, oRng, VArray : Variant;
  begin
    oXL := CreateOleObject('Excel.Application');
    oXL.Visible := False;
    oXL.DisplayAlerts := false;

    ... (all the processing to build the Excel file)

    oXL.Application.Workbooks[1].SaveAs(ExcelFilename, 51 { = xlWorkbookDefault } );
    oXL.Workbooks.Close;
    oXL.Application.Quit;
    oXL := Unassigned;
  end
);

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

Я думал, что все было здорово. Он работал на моем компьютере с Windows 10 с Office 2016. У меня было несколько пользователей, которые также успешно запускали его на своих компьютерах.

Но у меня был отчет от одного пользователя, где программа зависла, находясь в потоке. Я был в состоянии сделать несколько тестов. Когда код не запускался в потоке на его компьютере, он работал нормально (за исключением того, что, конечно, приложение перестало отвечать на запросы, и я не смог обработать запрос на отмену).

Единственное, что я могу сказать о машине пользователя, это то, что он работал под управлением Windows 7 и Office 2007.

Я не уверен на 100%, что Office Automation является многопоточной. Могу ли я поместить все это в поток, понимая, что некоторые команды автоматизации (какие?) Могут нуждаться в синхронизации? Если это не потокобезопасно, как еще я могу поддерживать адаптацию моего приложения во время генерации файла Excel?

Может ли быть так, что разница между Office Automation в Windows 7 по сравнению с Windows 10 или Office 2007 и Office 2016 приводит к сбою задачи в более старых версиях? Если так, есть ли обходной путь?

Автор: lkessler Источник Размещён: 08.11.2019 11:32

Ответы (1)


5 плюса

Очевидный недостаток в том, что вы не инициализировали COM в потоке. Звоните CoInitializeили CoInitializeEx.

Конечно, нет проблем с автоматизацией Excel из фонового потока. То, что вы пытаетесь, возможно. Вполне возможно, что в коде, который вы не показывали, есть ошибки, но пропущенная инициализация COM является единственной ошибкой, которую можно увидеть в коде вопроса.

Конечно, инициализация COM не легка, если вы не контролируете жизнь потока. Библиотека потоков создает поток, и вы не знаете, что уже запущено в этом потоке. Если бы я был тобой, я бы явно создал поток и избегал подхода на основе задач библиотеки потоков.

Автор: David Heffernan Размещён: 20.08.2016 04:03
Вопросы из категории :
32x32