Short : Можно ли выполнить компонент TCrpe из основного потока, не являющегося VCL?
Long : Я использую компонент TCrpe для создания отчетов для Crystal Reports.
До сих пор я использовал компонент в основном потоке VCL, и все было хорошо.
Но теперь я переместил компонент в фоновый поток. Одновременно существует только 1 экземпляр компонента, и доступ к нему осуществляется только одним потоком, который не является основным потоком VCL.
В моей тестовой среде все в порядке.
Но в производственной среде время от времени происходит сбой приложения: нарушения прав доступа; Неверные операции с указателями; Перечислите индекс из связанных исключений. Исключения могут возникать практически везде, и не всегда я получаю трассировку стека исключений.
Итак: нормально ли выполнять компонент TCrpe из основного потока, не являющегося VCL?
Я посмотрел на исходный код, и там используются некоторые вещи, связанные с GUI, что вызывает у меня сомнения. Они даже называют
while not PrintEnded do Application.HandleMessage;
оттуда. На самом деле этот путь кода не активирован из-за настроек моего отчета; однако, это заставляет меня задуматься, предназначен ли компонент TCrpe для использования в фоновых потоках вообще.
Кроме того, для некоторых отчетов компонент TCrpe показывает собственную форму для ввода пользователем дополнительных параметров отчета. Является ли это индикатором того, что они запутались в главном цикле обработки сообщений? Или может быть, они используют собственную очередь сообщений для этой формы?