Проблем с waveOutClose функция (VC++)
9 отговора
170 прегледа
Проблем с 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("Изпълнението никога няма да стигне дотук!");
...........................................................
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("Изпълнението никога няма да стигне дотук!");
...........................................................
Re: Проблем с waveOutClose функция (VC++)
Намерих решение на проблема. waveOutClose наистина затваря нишката на драйвера, така че извикването й от CALLBACK функцията затваря текущата нишка. Затова с PostMessage нотифицирам някой прозорец за финиширането на звука и не правя нищо друго. Прозоречната процедура на този прозорец (тя вече се изпълнява в друга нишка) обработва нотификацията, като съвсем спокойно извиква waveOutClose.
Re: Проблем с waveOutClose функция (VC++)
хм, все пак сигурен ли си че нишките преди са стоели? защото макар че затваряш нишката от самата нея, то тя пак трябва да се затвори.
Re: Проблем с waveOutClose функция (VC++)
Сигурен съм, защото например с Task Manager-а се виждаше увеличаването на броя им. Иначе нишката може би не се убива, а замръзва, като чака сама себе си да завърши.
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
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
да не е под 2000?
значи там съм забелязал разни такива защити.
сега ми дойде нещо друго на ума:
всъщност когато извикаш функцията за убиване на нишка, то тая функция се изпълнява някъде в ядрото. може би механизма на убиване на нишка изчаква докато нишката влезе отново в ринг 3, за да я килне в потребителския код. обаче понеже в случая сама себе си чака и се получава дедлок.
сега ми дойде нещо друго на ума:
всъщност когато извикаш функцията за убиване на нишка, то тая функция се изпълнява някъде в ядрото. може би механизма на убиване на нишка изчаква докато нишката влезе отново в ринг 3, за да я килне в потребителския код. обаче понеже в случая сама себе си чака и се получава дедлок.
Re: Проблем с waveOutClose функция (VC++)
Е, не е нужно - просто човека в момента се е сетил че е по-добре да използва Месаджинга на системата и директно направил просорец, ама може и със PostThreadMessage да стане това, без да прави прозорец, т.е може напр. да си notify-ne майн тред-а , а не да си прави прозорец за да има какво да нотифицира.
Re: Проблем с waveOutClose функция (VC++)
А, и още нещо - ако съсзаваш клас Bitmap, то да пражиш функции на които им кепиш винаги 1-вия параметър битмап, не е никак добре, защото, все пак, щом правиш клас, значи ползваш С++, щом го ползваш, значи ако направиш тези ф-ии мембъри на класа, с++ сам ще им го пусне този битмап във вид на this pointer.
А "микрософтаджиите" :-) правят така, щото, PSDK i drugite SDKs sa na C - procedurni sa, но те все пак където може си ползват някой от похватите на ОО дизайна.. затова,
А и не забравчй че за майкрософт Прозореца е каквото е Кравата за Индия :-)) - свещено животно
А "микрософтаджиите" :-) правят така, щото, PSDK i drugite SDKs sa na C - procedurni sa, но те все пак където може си ползват някой от похватите на ОО дизайна.. затова,
А и не забравчй че за майкрософт Прозореца е каквото е Кравата за Индия :-)) - свещено животно
Re: Проблем с waveOutClose функция (VC++)
:)
Ne se byah setil da si napaham cyaloto API v edin klas.
:)
Ne se byah setil da si napaham cyaloto API v edin klas.
:)
:)
забележката с прозореца е добра, мен също ме е дразнило. аз обаче съм толерантен човек и знам че най вероятно се дължи на някаква историческа дивотия. вероятно още от 3.0 ги има тия апита, а тогава сигурно друг начин за нотификация е нямало. всъщност може да е от чиста проба простотия, щото ако тия функции ги е писал геният, който е измислил структурата WAVEFORMATEX, то никаква тъпотия не би ме учудила. това ми е най-противната структура с която съм имал вземане даване, не защото няма и по-противни, а защото тя се намира на границата на търпимостта ми. затова просто по-противните, като VIDEOINFOHEADER не ги броя, защото за мен не съществуват
