2013-09-21 4 views
-1

Я создал DLL в C++ VS2010.C++: одновременное создание библиотеки DLL для нескольких процессов

Мне кажется, что 2 программы не могут получить к нему доступ в одно и то же время. Первая программа 1 должна завершить вызовы в DLL, только тогда DLL будет обрабатывать вызовы из другой программы.

Я хотел бы знать, есть ли какой-либо переключатель в настройках проекта, который мне нужно установить, чтобы сделать DLL «многопоточным».

DLL используется в Windows SAPI. Программа (в моем случае две программы) может ссылаться на SAPI и делать компьютерный голос (компьютерный голос - это DLL) что-то говорить. Я ожидал, что обе программы будут говорить одновременно, но так как они этого не делают (они ждут друг друга), я ожидал, что моя DLL будет однопоточной.

спасибо.

+3

Не могли бы вы предоставить более подробную информацию о том, что вы делаете? Не должно быть причин, по которым две программы не могут одновременно использовать одну и ту же DLL. Каждый загрузит DLL в свое собственное пространство памяти и выполнит код самостоятельно. В современной ОС ни один процесс не будет иметь никаких знаний или доступа к другому процессу. –

+0

Есть причины, по которым он может появиться, как описывает tmighty. Он может делать кучу вещей, удерживая замок загрузчика. Это также может быть синхронизация по именованному событию или другому примитиву синхронизации. У нас нет возможности узнать информацию. Но мои деньги находятся на замке загрузчика. –

+0

@MicahCaldwell DLL используется Windows SAPI. Программа (в моем случае две программы) может ссылаться на SAPI и делать компьютерный голос (в моем случае DLL) что-то говорить. Я ожидал, что обе программы будут говорить одновременно, но так как они этого не делают (они ждут друг друга), я ожидал, что моя DLL будет однопоточной. – tmighty

ответ

4

Речевой API сериализует речь из нескольких источников, поэтому они не воспроизводятся одновременно. Один будет играть первым, затем следующим и так далее, пока не будет более ожидающей речи для воспроизведения. Вы можете отключить эту функцию с помощью реестра, как описано здесь: http://msdn.microsoft.com/en-us/library/ee431801(v=vs.85).aspx#_Toc494873956

В частности, значение NoSerializeAccess в HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\Speech\AudioOutput\<AudioOutput1>\Attributes где <AudioOutput1> это имя вашего звукового устройства вывода.

Этой информации можно найти на сайте http://msdn.microsoft.com/en-us/library/speechplatform_ispaudio.aspx

Для того, чтобы предотвратить множественный TTS голос или двигатели говорить одновременно, Speech Platform упорядочивает вывод на объекты, которые реализуют интерфейс ISpAudio. Чтобы отключить сериализацию выходов для объекта ISpAudio, поместите в папку «Атрибуты» его токена атрибут «NoSerializeAccess».

Смежные вопросы