使用DCOM处理线程

时间:2013-03-11 12:59:22

标签: multithreading delphi freeze dcom delphi-6

我有一个关于多线程的概念性问题:

在使用RPC到DCOM的应用程序中,使用多线程公寓配置时,主窗体是冻结的。

1 - 如果在单元初始化中创建CriticalSession,关键会话中的代码将在主线程上下文中运行?

2 - 当您调用方法执行任务时:
      线程1已创建。 (DCOM线程)
      线程1创建线程2.
      线程1等待线程2.
      线程2创建4个线程以更快地运行任务       线程2循环休眠2秒,直到4个线程结束。在此过程中,应该刷新主窗体以显示完成的百分比。

表示已将消息发布到主表单线程并完成百分比,但没有任何反应,主表单已冻结。

3 - 有一种更好的方法,而不是synchronized()方法,当它们需要在线程2中的CRUD(创建读取更新删除)对象时,在4个线程中的一个内部进行同步?

4 - 4个线程的优先级高于主线程这是一个问题吗?当这成为一个问题?

下图显示了系统的架构:

System Architecture

1 个答案:

答案 0 :(得分:4)

1:否。通过使用cricital部分,您可以保证代码一次仅在一个线程中运行;在实践中,任何调用Enter的线程都将挂起,直到任何其他运行该代码的线程进入Leave调用。但这并不意味着它将在主线程中运行(使用GetCurrentThreadID检查)

2:你提到公寓配置,但哪个公寓线程模型?这定义了(D)COM何时为您进行线程同步。在实践中,COM将使用代理存根并在幕后编组以遍历公寓(和网络)边界,除非您选择了多线程单元,在这种情况下COM将假设组件负责线程问题本身。

如果我理解正确,主表单会冻结'Thread 1 WaitFor Thread 2'。而不是调用WaitFor,你最好在Thread2上使用OnTerminate事件。

3:我不确定“线程2中的CRUD对象”是什么意思。如果知道4个线程完成的顺序并不重要,我建议按顺序在线程上调用WaitFor。如果是,您应该查看WaitForMultipleObjects

4:不同的优先级应该不是问题。当有太多高优先级线程执行太多工作时,这可能只是一个问题,因此执行内部通信的普通优先级线程无法跟上,但在这种情况下,您应该查看工作线程如何报告其工作。