Crystal Reports - Является ли TCrpe для Delphi поточно-ориентированным? - PullRequest
0 голосов
/ 11 марта 2011

Short : Можно ли выполнить компонент TCrpe из основного потока, не являющегося VCL?

Long : Я использую компонент TCrpe для создания отчетов для Crystal Reports. До сих пор я использовал компонент в основном потоке VCL, и все было хорошо.

Но теперь я переместил компонент в фоновый поток. Одновременно существует только 1 экземпляр компонента, и доступ к нему осуществляется только одним потоком, который не является основным потоком VCL.

В моей тестовой среде все в порядке. Но в производственной среде время от времени происходит сбой приложения: нарушения прав доступа; Неверные операции с указателями; Перечислите индекс из связанных исключений. Исключения могут возникать практически везде, и не всегда я получаю трассировку стека исключений.

Итак: нормально ли выполнять компонент TCrpe из основного потока, не являющегося VCL?

Я посмотрел на исходный код, и там используются некоторые вещи, связанные с GUI, что вызывает у меня сомнения. Они даже называют

while not PrintEnded do Application.HandleMessage;

оттуда. На самом деле этот путь кода не активирован из-за настроек моего отчета; однако, это заставляет меня задуматься, предназначен ли компонент TCrpe для использования в фоновых потоках вообще.

Кроме того, для некоторых отчетов компонент TCrpe показывает собственную форму для ввода пользователем дополнительных параметров отчета. Является ли это индикатором того, что они запутались в главном цикле обработки сообщений? Или может быть, они используют собственную очередь сообщений для этой формы?

1 Ответ

2 голосов
/ 11 марта 2011

Если этот компонент показывает какие-либо формы, то он использует компоненты VCL.Все использование VCL в приложении должно выполняться в одном потоке, это требование VCL.

Вам нужно найти проект, который запускает весь код VCL в главном потоке приложения.

Сказав все это, это не объясняет, почему вы видите сбои только вдали от тестовой среды.Совет по многопоточности действителен, но, скорее всего, у вас другая проблема.

...