短:可以在非VCL主线程中执行TCrpe组件吗?
长:我使用TCrpe组件为Crystal Reports创建报告。 到目前为止,我使用了VCL主线程中的组件,一切都很好。
但现在我将组件移动到后台线程中。一次只有一个组件实例,它只能由一个单独的线程访问,而不是VCL主线程。
在我的测试环境中,一切似乎都很好。 但是在生产环境中,应用程序会不时崩溃:访问违规;指针操作无效;列出索引超出限制的异常。异常几乎可以在任何地方发生,并不总是得到异常堆栈跟踪。
那么:从非VCL主线程中执行TCrpe组件是否可以?
我查看了源代码,并在那里使用了一些与GUI相关的东西,这让我怀疑。他们甚至打电话给
while not PrintEnded do Application.HandleMessage;
从那里开始。实际上,由于我的报告设置,此代码路径未激活;但是,它让我想知道TCrpe组件是否打算在后台线程中使用。
此外,对于某些报告,TCrpe组件会显示一个自己的表单,供用户输入其他报告参数。这是否表明他们正在弄乱主要的消息事件循环?或者可能是他们正在为该表单使用自己的消息队列?
答案 0 :(得分:2)
如果此组件显示任何表单,则它使用VCL组件。在应用程序中使用VCL必须在同一个线程中完成,这是VCL的要求。
您需要找到一个在主应用程序线程中运行所有VCL代码的设计。
说了这么多,这并不能解释为什么你看到崩溃只是远离测试环境。关于线程的建议是有效的,但你很可能有一个不同的问题。