Проблем с waveOutClose функция (VC++)

9 отговора 170 прегледа
#1

Проблем с waveOutClose функция (VC++)

Използвам waveform функции за ъвзпроизвеждане на звук, с CALLBACK функция за нотификации от драйвера. Когато възпроизвеждането свърши, извикването на waveOutClose никога не връща управлението, и тази нишка остава незатворена. При ново стартиране на звука, се създава нова нишка, която също никога няма да се затвори. В резултат броят на нишките нарства значително. При дисасемблирането установих, че блокирането става при извикване на функцията WaitForSingleObject за някакво събитие (event). Ето един прост примерен код:
void CALLBACK waveProc(HWAVEOUT hwo, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
{
switch (uMsg)
{
case WOM_OPEN:
break;
case WOM_DONE:
waveOutUnprepareHeader(...)
waveOutClose(...)
//
AfxMessageBox("Изпълнението никога няма да стигне дотук!");

...........................................................

Отговор
в отговор на waveDepressed #2

Re: Проблем с waveOutClose функция (VC++)

Намерих решение на проблема. waveOutClose наистина затваря нишката на драйвера, така че извикването й от CALLBACK функцията затваря текущата нишка. Затова с PostMessage нотифицирам някой прозорец за финиширането на звука и не правя нищо друго. Прозоречната процедура на този прозорец (тя вече се изпълнява в друга нишка) обработва нотификацията, като съвсем спокойно извиква waveOutClose.

Отговор
в отговор на waveDepressed #3

Re: Проблем с waveOutClose функция (VC++)

хм, все пак сигурен ли си че нишките преди са стоели? защото макар че затваряш нишката от самата нея, то тя пак трябва да се затвори.

Отговор
в отговор на zaphod #4

Re: Проблем с waveOutClose функция (VC++)

Сигурен съм, защото например с Task Manager-а се виждаше увеличаването на броя им. Иначе нишката може би не се убива, а замръзва, като чака сама себе си да завърши.

Отговор
в отговор на waveDepressed #5

Re: Проблем с waveOutClose функция (VC++)

[OT]
mnogo se kefya na windoze-to:

Iskash da playvash sound? - nyama problem - napravi si prozorec.
Iskash da polzwash network? - nyama problem - napravi si prozorec.
...

Kak hubavo neshta deto nyamat nishto obshto s prozorci iskat takiva.
I az taka pochvam da si design-vam proektite:

1. Sazdavam klasa Bitmap
2. Vsqka netrivialna funkciya w project-a poluchava oshte edin parametar Bitmap *&

Eto sega kolko dobre go design-ah:

MyPrintf( bitmap, "%s\n", "Hello world" ); //poluchavame kartinka s "Hello world" na neya

MyScanf( bitmap, "%s", pText); //tova pravi OCR

MyFormatC( bitmap ); //tova formatira C: i vrashta kartinka na loshite klasteri

MyDickSuckedByBillGates( bitmap ); //tova ne e za malki deca

Отговор
в отговор на waveDepressed #6

да не е под 2000?

значи там съм забелязал разни такива защити.
сега ми дойде нещо друго на ума:
всъщност когато извикаш функцията за убиване на нишка, то тая функция се изпълнява някъде в ядрото. може би механизма на убиване на нишка изчаква докато нишката влезе отново в ринг 3, за да я килне в потребителския код. обаче понеже в случая сама себе си чака и се получава дедлок.

Отговор
в отговор на FP #7

Re: Проблем с waveOutClose функция (VC++)

Е, не е нужно - просто човека в момента се е сетил че е по-добре да използва Месаджинга на системата и директно направил просорец, ама може и със PostThreadMessage да стане това, без да прави прозорец, т.е може напр. да си notify-ne майн тред-а , а не да си прави прозорец за да има какво да нотифицира.

Отговор
в отговор на FP #8

Re: Проблем с waveOutClose функция (VC++)

А, и още нещо - ако съсзаваш клас Bitmap, то да пражиш функции на които им кепиш винаги 1-вия параметър битмап, не е никак добре, защото, все пак, щом правиш клас, значи ползваш С++, щом го ползваш, значи ако направиш тези ф-ии мембъри на класа, с++ сам ще им го пусне този битмап във вид на this pointer.

А "микрософтаджиите" :-) правят така, щото, PSDK i drugite SDKs sa na C - procedurni sa, но те все пак където може си ползват някой от похватите на ОО дизайна.. затова,
А и не забравчй че за майкрософт Прозореца е каквото е Кравата за Индия :-)) - свещено животно

Отговор
в отговор на Zaphod® #9

Re: Проблем с waveOutClose функция (VC++)

:)
Ne se byah setil da si napaham cyaloto API v edin klas.
:)

Отговор
в отговор на FP #10

:)

забележката с прозореца е добра, мен също ме е дразнило. аз обаче съм толерантен човек и знам че най вероятно се дължи на някаква историческа дивотия. вероятно още от 3.0 ги има тия апита, а тогава сигурно друг начин за нотификация е нямало. всъщност може да е от чиста проба простотия, щото ако тия функции ги е писал геният, който е измислил структурата WAVEFORMATEX, то никаква тъпотия не би ме учудила. това ми е най-противната структура с която съм имал вземане даване, не защото няма и по-противни, а защото тя се намира на границата на търпимостта ми. затова просто по-противните, като VIDEOINFOHEADER не ги броя, защото за мен не съществуват

Отговор