【问题标题】:Threading in BHO/ATL/COM. Winapi or something else?BHO/ATL/COM 中的线程。 Winapi 还是别的什么?
【发布时间】:2011-05-16 04:21:12
【问题描述】:

我正在编写 IE 插件,并且正在使用 ATL。我需要创建后台工作线程,以便 UI 线程将尽快解除阻塞。 我的问题是,我应该使用 Winapi、CreateThread 等创建线程的最低可能方式吗?

或者是否有其他方法可以在 BHO/ATL/COM 项目中创建工作线程?

我必须先学习这些东西,所以我想我会先问;)

【问题讨论】:

    标签: c++ multithreading com atl bho


    【解决方案1】:

    除非您需要它们提供的控制级别,否则无需使用低级 API。

    使用 ATL,您已经拥有 CWorkerThread,但如果您愿意,也可以使用其他库,例如 Boost.Thread

    【讨论】:

    • 谢谢。我想这就是我要找的。如果我已经有了一些东西,我不想为这个简单的任务添加任何过多的库。我试图使用这个 CWorkerThread 但我仍然不知道如何。你能在这里看看我的另一个问题吗:stackoverflow.com/questions/4294629
    【解决方案2】:

    如果您要一直使用 API,那么如果您的线程将使用 CRT,则_beginthreadex 优于 CreateThread()。 (如果你不知道,它可能会)

    【讨论】:

    • 这个问题很久以前就解决了,CreateThread 可以正常工作。 crt源代码中的_getptd()。
    【解决方案3】:

    通常,您会使用 boost::thread、Visual Studio ConCRT 或 Intel TBB,具体取决于您的线程需求有多极端。对于最简单的用途,选择 boost::thread。对于更高级的用途,选择 ConCRT 或 TBB。不要使用 WinAPI,除非您非常渴望其他库中没有提供的某些功能。一个简单的事实是,如果您用 C++ 编写库,那么将 WinAPI 用于线程就像回到汇编程序编写程序一样。留在 C++ - 使用 Boost。

    【讨论】:

    • 不同意 API 的仇恨。我一直在使用 API。精益、简单、容易。
    • @John:“简单”和“简单”是我以前从未听说过用于描述 Win32 API 的两个词。我们在这里谈论的是同一件事吗?我的意思是,它偶尔会被记录不足,极度不一致,并且充满了奇怪的陷阱、警告和极端案例。
    • @John Dibling:API 没有任何问题——只是 WinAPI。它是旧的,并且是为 C 设计的。没有理由使用它来代替非常优越的 boost::thread。
    • 我认为仅仅为了管理单个后台工作线程而引入像 boost 这样的高级跨平台库有点荒谬,特别是当您的代码库必须是特定于平台的时.
    猜你喜欢
    • 2017-12-21
    • 2011-04-09
    • 1970-01-01
    • 2011-10-03
    • 2016-12-30
    • 2011-11-04
    • 1970-01-01
    • 2018-12-31
    • 2013-09-16
    相关资源
    最近更新 更多