Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[C++] waveInOpen, Callback resulteert in 'thread exited'

Pagina: 1
Acties:

  • MichielPH
  • Registratie: Februari 2005
  • Laatst online: 14-07-2024
In MS Visual Studio '05 heb ik een programmaatje geschreven die de ADC-waarden van de geluidskaart binnenhaalt. De betreffende geluidsbron open ik met:
code:
1
2
MMRESULT res;
res = waveInOpen(&hWaveIn, WAVE_MAPPER, &wfx, (DWORD) this->record_callback, this, CALLBACK_FUNCTION);


Als ik het programma compileer voor Vista, dan werkt dit en de waarden kloppen. Als ik echter dezelfde code compileer voor WinCE[1], dan resulteert dit in The program '[21b6671a] Phonetogram.exe' has exited with code -1073741571 (0xc00000fd).[2] Status_Stack_Overflow.

Als ik geen gebruik maak van de callback, heb ik geen last van de foutmelding. Ik wil daar wel gebruik van maken, dus waar zit het verschil in WinCE en Win32?


[1]: Debug Pocket PC 2003 (ARMV4)
[2]:#define STATUS_STACK_OVERFLOW 0xC00000FD

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Ik denk dat je een te groot object op de stack alloceert? CE zal met een kleinere default stack size compileren.

  • MichielPH
  • Registratie: Februari 2005
  • Laatst online: 14-07-2024
Waar alloceer ik dat dan? Het is een standaard MS-functie, dus daarbinnen weet ik niet wat er gebeurt.

In de functie-aanroep staan pointers naar de functie en onderstaande code, wat dus ook niet meer dan enkele bytes is. Het daadwerkelijk alloceren van het geheugen voor ADC-waarden gebeurt later en komt de pda dus niet aan toe, omdat hij al het programma al sluit.
code:
1
2
3
4
5
6
7
8
9
10
    WAVEFORMATEX wfx; /* look this up in your documentation */
    MMRESULT result; /* for waveOut return values */

    wfx.nSamplesPerSec = 48000; /* sample rate */
    wfx.wBitsPerSample = 16; /* sample size */
    wfx.nChannels = 1; /* channels */
    wfx.cbSize = 0; /* size of _extra_ info */
    wfx.wFormatTag = WAVE_FORMAT_PCM;
    wfx.nBlockAlign = (wfx.wBitsPerSample >> 3) * wfx.nChannels;
    wfx.nAvgBytesPerSec = wfx.nBlockAlign * wfx.nSamplesPerSec;

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-11 18:33
Zal een linker instelling zijn

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Ik heb geen idee, ik kan geen MS code debuggen...

Probeer eens eens de linker optie /STACK:10000000 bv; werkt het dan wel?

Een andere mogelijkheid is dat je callback recursief is. Ik ken eigenlijk maar twee manieren om een stack overflow te triggeren:

C++:
1
2
3
4
5
6
7
8
9
struct X{
char[1024*1024*100];
};

X x; // stack overflow

void foo() {
   foo(); // stack overflow
}

[ Voor 51% gewijzigd door Zoijar op 27-06-2008 11:31 ]


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-11 18:33
Het kan ook zijn dat de callback vaker wordt aangeroepen dan de code die erin staat / snelheid van je device aankan.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Een andere optie is dat je in de callback iets doet waardoor je terug naar het OS gaat, voordat je returnt. De eerste call blijft dan op de stack staan. Om 1 of andere reden roept WinCE je callback daarna opnieuw aan (vorige input niet afgehandeld?), waardoor je weer een call op de stack krijgt, enzovoorts.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1