2012-11-17 137 views
2

我有一个实现com服务器的Delphi7程序。由于一些新的数据库查询,最近完成程序初始化的时间有所增加。我的意思是程序启动是程序能够以有意义的方式处理传入的COM调用所花费的时间。 我的问题是我如何处理传入的COM调用程序尚未正确初始化。放弃呼叫中包含的信息不是一种选择,呼叫需要等待程序初始化。 使用布尔初始化变量的简单while循环是否足够? 我问,因为我读过com调用在主VCL线程中执行,这会提示while循环会导致程序挂起(初始化也发生在VCL线程中)。Delphi7如何让Com对象等到程序初始化完成?

互斥不能被用于WAITFOR同一线程内执行的代码,是吗?

换一种方式,做一个COM调用(COM服务器)VCL线程执行interupt,直到它完成或怎么做的代码相同的线程的工作中这种并发执行? 感谢您抽出时间。

+0

COM不介意等待。你为什么想帮忙?不要帮忙。 –

+0

但是如果一个com调用在vcl线程内执行并且初始化发生在VCL线程中,那么不会有一个while循环阻塞该线程并导致initilisation不能完成? 当Windows启动一个包含com服务器的delphi程序时,在com函数被调用之前执行哪些部分(初始化部分,窗体创建)?如果我知道,那么我可以确保在初始化完成之前,com函数永远不会执行。 – MCS

回答

1

移动数据库的逻辑出了主线程,因此它不再被阻止。

+0

初始化依赖于在GUI上显示信息。如果我将它移动到另一个线程,我将需要调用同步(我猜)或使用消息来避免访问冲突,因为VCL组件不是线程安全的(不是确切地说明了那个部分,而是它对于我如何理解VCL上班)。如果这个前提是正确的,那么这些机制中哪一个都不会挂起程序,因为VCL线程停留在com调用中? 嗯。或者我可以在这种情况下使用互斥体和waitfor ...? – MCS

+0

然后从您的UI中分离初始化。让初始化将信息存储在内存中并继续前进,然后让UI获取该信息并在闲暇时显示它。 –

0

COM服务器(EXE)等待Applcation.Run控制流程之前返回到COM客户端,因此,所有形式和数据模块应该初始化。

然而,当一个形式创建另一个OLE对象(在FORMCREATE即打开Word文档()的事件处理程序),这可能中断等待并立即返回控制给客户端COM。

尝试检查Applcation.Run之前创建本地化的问题形式的所有初始化代码。