【问题标题】:Delphi7 How to make Com object wait until program initilisation is complete?Delphi 7 如何让 Com 对象等到程序初始化完成?
【发布时间】:2012-11-17 13:38:18
【问题描述】:

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

互斥锁不能用于等待同一线程中执行的代码,对吧?

换句话说,com 调用是否会中断(com 服务器的)VCL 线程的执行,直到它完成,或者在同一线程中并发执行代码是如何工作的? 感谢您抽出宝贵时间。

【问题讨论】:

  • COM 不介意等待。你为什么要帮忙?不要帮忙。
  • 但是如果 com 调用在 vcl 线程中执行并且初始化发生在 VCL 线程中,那么 while 循环不会阻塞该线程并导致初始化永远不会完成吗?当 windows 启动一个包含 com 服务器的 delphi 程序时,在调用 com 函数之前执行了哪些部分(初始化部分,表单创建)?如果我知道,那么我可以确保在初始化完成之前永远不会执行 com 函数。

标签: multithreading delphi com initialization delphi-7


【解决方案1】:

将您的数据库逻辑移出主线程,使其不再被阻塞。

【讨论】:

  • 初始化依赖于在 GUI 上显示信息。如果我将它移动到不同的线程,我将需要调用同步(我猜)或使用消息来避免访问冲突,因为 VCL 组件不是线程安全的(不太确定那部分,但它是我如何理解 VCL去工作)。如果这个前提是正确的,那么这些机制中的任何一个都不会因为 VCL 线程卡在 com 调用中而挂起程序吗?嗯。或者我可以在这种情况下使用互斥锁并等待...?
  • 然后将初始化与 UI 分离。让初始化将信息存储在内存中的某个位置并继续,然后让 UI 拾取该信息并在空闲时显示它。
【解决方案2】:

COM 服务器 (EXE) 在将控制流返回给 COM 客户端之前等待 Applcation.Run,​​因此所有的表单和数据模块都应该被初始化。

但是,当表单创建另一个 OLE 对象(即在 FormCreate() 事件处理程序中打开 Word 文档)时,这可能会中断等待并将控制权立即返回给 COM 客户端。

尝试检查在 Applcation.Run 之前创建的表单的所有初始化代码以定位问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-04
    • 1970-01-01
    • 2013-01-28
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多