【发布时间】:2011-03-11 16:14:06
【问题描述】:
Short:可以在非VCL主线程中执行TCrpe组件吗?
Long:我使用 TCrpe 组件为 Crystal Reports 创建报表。 到目前为止,我在 VCL 主线程中使用了该组件,一切都很好。
但现在我将组件移动到后台线程中。组件一次只有1个实例,并且只能被一个单线程访问,不是VCL主线程。
在我的测试环境中,一切似乎都很好。 但是在生产环境中应用时常崩溃:访问违规;无效的指针操作;列出索引超出范围的异常。异常几乎可以在任何地方发生,而且我并不总是得到异常堆栈跟踪。
那么:可以在非 VCL 主线程中执行 TCrpe 组件吗?
看了源码,里面用到了一些GUI相关的东西,让我怀疑。他们甚至打电话给
while not PrintEnded do Application.HandleMessage;
从那里。实际上,由于我的报告设置,此代码路径未激活;但是,这让我想知道 TCrpe 组件是否完全适合在后台线程中使用。
此外,对于某些报告,TCrpe 组件会显示一个自己的表单,供用户输入其他报告参数。这是否表明他们正在搞乱主消息事件循环?还是他们正在为该表单使用自己的消息队列?
【问题讨论】:
-
while not PrintEnded do Application.HandleMessage将在打印机回调中,并在打印时保持您的 UI 响应。 -
@David 是的,但是从不是 VCL 主线程的线程中调用它是致命的,不是吗?
-
不一定。如果你在一个没有创建任何窗口的线程上调用它,那么甚至可能没有消息队列,它是无害的。
标签: multithreading delphi crystal-reports