
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
19.11.2015, 09:08
|
|||
|---|---|---|---|
|
|||
Народ, помогите, мозг уже сломал. WASAPI. C++. |
|||
|
#18+
Итак, имеем код, который отслеживает события. IMMNotificationClient - вот он отслеживает. Я также держу список объектов IAudioSessionControl. По событию вызываю метод Release(). Всё. Зависон. Всё, что нашёл, это китаец создаёт отдельный поток и отправляет циклу обработки сообщений этого потока сообщения. Но и он, как я понял, столкнулся с этой проблемой. Он вызывает Sleep(200). Костыль же. Я считаю, правильное решение - это узнавать, находится ли поток в обработке события IMMNotificationClient. Если находимся - ждём. Как вышли - вызываем наш Release(). Как это сделать на практике? Нашёл такую функцию: LeaveCriticalSectionWhenCallbackReturns. Но чот не врубаюсь как метод класса ей передать. И вообще правильно ли так будет. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
23.11.2015, 04:12
|
|||
|---|---|---|---|
|
|||
Народ, помогите, мозг уже сломал. WASAPI. C++. |
|||
|
#18+
Всё, разобрался. Проблема, естественно, в deadlock. В процессе обработки события IMMNotificationClient происходило событие из интерфейса IAudioSessionNotification. Нужно иметь ввиду, что при использовании критических секций любой вызов WASAPI вызовет deadlock, а не только вызов метода в пределах одного интерфейса. Выход из положения нашёл в использовании Lock-free стека для Windows в качестве очереди сообщений потоку-обработчику. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
23.11.2015, 14:10
|
|||
|---|---|---|---|
Народ, помогите, мозг уже сломал. WASAPI. C++. |
|||
|
#18+
Acute, Я вообще не понимаю, что там у тебя и как, что это за IMMNotificationClient, но PostThreadMessage() обкладывать критическими секциями не нужно ни при каких обстоятельствах, тем более данных при этом не посылается. При доступе к данным, которые посылаются, возможно, нужны секции или другая синхронизация, но не для посылки сообщения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=57&mobile=1&tid=2018724]: |
0ms |
get settings: |
8ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
34ms |
get topic data: |
11ms |
get forum data: |
4ms |
get page messages: |
35ms |
get tp. blocked users: |
2ms |
| others: | 212ms |
| total: | 330ms |

| 0 / 0 |
