【问题标题】:C++ setTimout function?C ++ setTimeout函数?
【发布时间】:2010-04-20 19:58:49
【问题描述】:

对于像 C++ 中的 setTimeout-function 这样的 JavaScript,最便宜的方法是什么?

我需要这个: 5000 毫秒后,启动函数 xy(无参数,无返回值)。

原因是我需要初始化 COM 以将文本转语音,但是当我在 dll attach 上执行此操作时,它会崩溃。

如果我不从 dllmain 调用 CoInitialize,它可以正常工作。

我只需要调用 CoInitialize 和 CoCreateInstance,然后在其他函数中使用该实例。我可以通过检查 NULL 来捕获未初始化的实例,但我需要初始化 COM - 不会崩溃。

【问题讨论】:

    标签: c++ com multithreading


    【解决方案1】:

    DllMain() 调用CoInitialize() 是一件坏事;从DllMain() 可以做的事情有很多限制;看这里:http://blogs.msdn.com/larryosterman/archive/2004/04/23/118979.aspx

    即使它确实可以可靠地工作,那么从DllMain() 中初始化 COM 也不是一件特别好的事情,因为 COM 是按线程初始化的,而且您不知道应用程序本身想要对 COM 单元做什么对于您要为其初始化 COM 的线程...这意味着您可能会以一种方式初始化 COM,然后应用程序可能需要以另一种方式初始化它,并且可能由于您的 DLL 所做的事情而失败...

    只要你小心,你就可以在DllMain() 中启动一个线程(参见此处http://blogs.msdn.com/oldnewthing/archive/2007/09/04/4731478.aspx),然后在该线程上初始化 COM 并在该线程上执行所有与 COM 相关的工作。您需要将使用 COM 所需的任何数据从您被调用的任何线程编组到您自己的 COM 线程,并从那里进行 COM 调用...

    还有一个问题是,您创建的 COM 对象的实例(您能否可靠地执行您想做的事情)是否可以从调用您的 DLL 以进行调用的线程中使用...您明白如果需要,你必须如何编组接口指针等吗?

    或者,您应该通过 COM 公开您的功能,然后让应用程序将您的 DLL 作为 COM DLL 加载,一切都会正常工作。您可以指定所需的公寓类型,该应用负责为您正确设置。

    因此,总而言之,您不需要问题的答案。

    【讨论】:

    • 这和我的问题有什么关系?我只是想避免在 DllMain 中调用 CoInitialize,这就是为什么我需要 setTimeout 来在 DllMain 完成后执行该函数。线程也不是解决方案,你不能真正在 DllMain 中启动线程...
    • PS:不,我无法导出函数并从可执行文件中调用它,因为我没有可执行文件的源代码。
    • 那么,假设您可以设置您想要的计时器,那么在 DllMain() 返回后代码将在哪个线程上执行?按照我发布的链接,如果您遵守规则,您可以在 DllMain() 中启动一个线程;但仍然不推荐。而且,正如我所指出的,这不是您决定应该在应用程序拥有的线程上以特定方式初始化 COM...
    • 完成了。虽然不推荐,但确实可以从 dllmain 启动线程。然而,无法从线程外部访问 COM 类指针,它在外部为 NULL。所以你必须使用向量,从线程外部推送数据,然后将它们弹出到线程中,在无限循环中休眠。这样它就永远不会正确地未初始化,但我不在乎。
    • 这并不完全正确,如果您愿意,您可以从线程外部访问 COM 接口指针,但您需要 a) 确保 COM 以您希望的方式初始化您要从中访问指针的线程和 b) 您将接口指针从您共同创建它的线程编组到您要使用它的线程的线程。听上去,您只是在使用向量将参数从 DLL 中的调用线程编组到 COM 线程……可能有比使用睡眠更好的方法,也许是事件或信号量?
    【解决方案2】:

    当完全停止执行5秒就可以了,你可以使用Winapi Sleep函数。请注意,Sleep 的文档说明 CoInitialize 和 Messages 可能存在一些问题。

    【讨论】:

      猜你喜欢
      • 2019-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多