C ++ функция setTimout? - PullRequest
       14

C ++ функция setTimout?

1 голос
/ 20 апреля 2010

Какой самый дешевый способ для JavaScript, как setTimeout-функция в C ++?

Мне нужно это: Через 5000 миллисекунд, запустите функцию xy (без параметров, без возвращаемого значения).

Причина этого в том, что мне нужно инициализировать COM для преобразования текста в речь, но когда я делаю это при подключении dll, происходит сбой.

Однако он работает нормально, если я не вызываю CoInitialize из dllmain.

Мне просто нужно вызвать CoInitialize и CoCreateInstance, а затем использовать экземпляр в других функциях. Я могу поймать неинициализированный экземпляр, проверив NULL, но мне нужно инициализировать COM - без сбоев.

Ответы [ 2 ]

5 голосов
/ 20 апреля 2010

Звонить CoInitialize() из DllMain() - плохая вещь; Есть множество ограничений на то, что вы можете сделать с DllMain(); смотри здесь: http://blogs.msdn.com/larryosterman/archive/2004/04/23/118979.aspx

Даже если он ДЕЙСТВИТЕЛЬНО работал, тогда инициализация COM изнутри DllMain() не особенно полезна, поскольку 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, и все будет работать нормально. Вы можете указать тип квартиры, который вам нужен, и приложение будет отвечать за правильную настройку.

Итак, в общем, вам не нужен ответ на ваш вопрос.

0 голосов
/ 20 апреля 2010

Когда все в порядке, чтобы полностью остановить выполнение на 5 секунд, вы можете использовать функцию Winapi Sleep . Помните, что документация Sleep помнит о некоторых возможных проблемах с CoInitialize и Messages.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...