使用 DCOM 处理线程
Posted
技术标签:
【中文标题】使用 DCOM 处理线程【英文标题】:Working with threads with DCOM 【发布时间】:2013-03-11 12:59:21 【问题描述】:我有一个关于多线程的概念性问题:
在通过 DCOM 使用 RPC 的应用程序中,具有多线程公寓配置,主要形式是冻结。
1 - 如果在单元初始化中创建了CriticalSession,那么关键会话中的代码会在主线程上下文中运行吗?
2 - 当你调用方法执行任务时: 创建线程 1。 (DCOM 线程) 线程 1 创建线程 2。 线程 1 等待线程 2。 线程 2 创建 4 个线程以更快地运行任务。 线程 2 循环休眠 2 秒,直到 4 个线程结束。在这个过程中,主窗体应该被刷新以显示完成的百分比。一条消息以完成百分比发布到主窗体线程,但没有任何反应,主窗体被冻结。
3 - 当需要在线程 2 中进行 CRUD(创建读取更新删除)对象时,有一种更好的方法来代替 synchronized() 方法,以便在 4 个线程之一中进行同步?
4 - 4 个线程的优先级高于主线程,这是个问题吗?当这成为一个问题?
下图代表系统架构:
【问题讨论】:
这是一个挑剔的问题,但我建议稍微改变一下标签,也许像 DCOM 然后多线程,然后其余的可能不是真的必要,因为 DCOM(理论上)不受什么影响客户端和服务器使用的语言。如果这是德尔福特有的东西,你能添加更多关于它的信息吗?或者这只是“这是我正在使用的语言,以防它有所作为”之类的事情? @jrh 这只是“这是我正在使用的语言,以防它有所作为”之类的事情 【参考方案1】:1:不。通过使用关键部分,您可以保证代码一次只在一个线程中运行;实际上,任何调用 Enter 的线程都会挂起,直到任何其他也在运行该代码的线程到达 Leave 调用为止。但这并不意味着它会在主线程中运行(检查 GetCurrentThreadID)
2:您提到了单元配置,但是哪个单元线程模型?这定义了 (D)COM 何时为您执行线程同步。在实践中,COM 将使用代理存根并在后台编组以遍历单元(和网络)边界,除非您选择了多线程单元,在这种情况下,COM 将假定组件负责线程自己的问题。
如果我理解正确,主窗体会冻结在“线程 1 WaitFor 线程 2”上。与其调用 WaitFor,不如在 Thread2 上使用 OnTerminate 事件。
3:我不确定您所说的“线程 2 中的 CRUD 对象”是什么意思。如果知道 4 个线程以什么顺序完成并不重要,我建议按顺序在线程上调用 WaitFor。如果是,请查看WaitForMultipleObjects。
4:不同的优先级应该不是问题。只有当有太多的高优先级线程在做太多的工作时才会出现问题,因此进行内部通信的普通优先级线程无法跟上,但在这种情况下,您应该查看工作线程如何报告他们的工作。
【讨论】:
现在解释得更好了?? Crud =(创建读取更新和删除)它是多线程单元。 在数据库访问中?这 4 个线程每个都需要一个数据库连接,否则您将不会获得任何性能增强,具体取决于您使用的数据库。我的答案仍然有效。 不是数据库,哈哈...访问内存对象,我只是用了缩写,方便打字... 如果我没记错的话,COM EXE 在本地运行(因此是普通的 COM,而不是 DCOM)实际上创建并导出了一个隐藏的 HWND,ActiveX 子系统使用编组的接口调用数据将消息发送到该 HWND。因此,“事件”在处理消息泵的主线程中运行。 我的立场是正确的,似乎here 现代 Windows 版本在引擎盖下使用了一个名为 ALPC 的东西......以上是关于使用 DCOM 处理线程的主要内容,如果未能解决你的问题,请参考以下文章