C ++ setTimout函数?

时间:2010-04-20 11:32:51

标签: c++ com multithreading

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

我需要这个: 从现在起5000毫秒,启动函数xy(没有参数,没有返回值)。

原因是我需要为文本到语音初始化COM,但是当我在dll attach上执行它时,它会崩溃。

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

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

2 个答案:

答案 0 :(得分:5)

CoInitialize()拨打DllMain()是一件坏事;你可以从DllMain()做些什么的限制;见这里:http://blogs.msdn.com/larryosterman/archive/2004/04/23/118979.aspx

即使DID工作可靠,然后从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,一切都会正常工作。您可以指定所需的公寓类型,并且应用程序负责为您正确设置。

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

答案 1 :(得分:0)

如果可以完全停止执行5秒,则可以使用Winapi Sleep功能。请注意Sleep的文档考虑了CoInitialize和Messages的一些可能的问题。