在C ++中像setTimeout-function这样的JavaScript最便宜的方法是什么?
我需要这个: 从现在起5000毫秒,启动函数xy(没有参数,没有返回值)。
原因是我需要为文本到语音初始化COM,但是当我在dll attach上执行它时,它会崩溃。
如果我不从dllmain调用CoInitialize,它可以正常工作。
我只需要调用CoInitialize和CoCreateInstance,然后在其他函数中使用该实例。我可以通过检查NULL来捕获未初始化的实例,但我需要初始化COM - 不会崩溃。
答案 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的一些可能的问题。