multithreading - 关于线程、COM+ 和 STA 单元的几个问题

标签 multithreading delphi com+ sta

我有一个 Windows 服务,它创建 10 个线程 + 一个创建任务列表的线程。

这 11 个线程中的每一个都通过调用 CoInitialize(nil) 进入 STA。

  • 任务列表由一个线程创建,另一个线程获取项目,处理它并释放....

  • a) 其他线程可以使用其他线程创建的对象吗?
    (这似乎有效,但是..)
    b) 其他线程可以释放其他线程分配的内存吗?
    (这似乎不起作用......)

    我应该以某种方式编码线程之间的指针吗?
    或者我是否应该至少获得该项目,对其进行处理,但让它成为创建它的线程的“所有者”?
  • 在我的 Windows 服务中,我创建了可用于启动/停止服务(暂停和恢复线程)的功能。

  • 但是,我对实际收集数据并在间隔内执行的线程有疑问。
    当线程加载要处理的项目后,它进入休眠状态 5 分钟。
    我怎样才能安全地终止这样的线程?如何中止 sleep 状态?

    在此先感谢您的帮助!

    最佳答案

    您可能必须跨线程编码接口(interface)。 Here您可以找到一个 C++ 示例,同一篇文章展示了您可以使用的三种技术 (oMarshalInterThreadInterfaceInStream/CoMarshalInterface/Global Interface Table(GIT))。有关它们的更多信息,您可以在 MSDN 中找到。

    要让线程等待但能够在 sleep 结束之前终止它,请使用具有适当超时值的 WaitForSingleObject() 以及要等待的 Windows 事件。当函数退出时,它会告诉它是否因为超时或事件已设置而退出。要在达到超时之前退出等待功能,只需设置事件。因此,您可以选择是进入另一个等待循环还是退出。

    关于multithreading - 关于线程、COM+ 和 STA 单元的几个问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5288619/

    相关文章:

    vb6 - 无需访问 HKEY_CLASSES_ROOT 的远程 DLL 注册

    .net - COM+ 组件由 C# 中的 Windows 服务托管,用于控制外部设备

    c++ - std::cout 线程安全格式化和 io 操作

    java - 如何从服务调用的线程更改 Activity 的进度条进度?

    c# - C#中Delphi单元的等价物是什么?

    c# - 检查 COM+ 应用程序是否已经在运行?

    c# - 跨共享实例的线程安全 (C#)

    java - CompletableFutures 的 Future 上的 get 方法

    delphi - 如何让鼠标移到面板上时出现面板?德尔菲

    delphi - 为什么在我的程序开始之前 GetLastError 出现错误?