[ ATL VB ] Events vanuit een thread

Pagina: 1
Acties:

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 24-08 22:38
In een poging iets aan de verotte vb timers te doen ( waarom doen ze dat ding in godsnaam in een control ? ) maakte ik mbv VC6 een ATL component met een start en stop methode en een Elapsed event.

De onderliggende timers zijn multimedia timers.


< start snippet >

C++:
1
2
3
4
5
6
7
8
STDMETHODIMP CTimer::Start( long interval, int* index )
{
                /* initialisatie e.d. */ 
    MMRESULT res = timeSetEvent( interval, timer_res, timerCallback,  
                (unsigned long) this , TIME_PERIODIC | TIME_CALLBACK_FUNCTION );

    return S_OK;
}


Zoals u ziet wordt een callback gebruikt, die ( vanuit de mmtimer ) in een andere thread loopt.

De callback ziet er zo uit:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void CALLBACK CTimer::timerCallback( UINT uID, UINT uMsg, DWORD dwUser, 
                                     DWORD dw1, DWORD dw2 )
{
    CTimer * pTmrInstance = reinterpret_cast< CTimer * > ( dwUser );

    for( int i = 0; i < pTmrInstance -> MAX_TIMERS; ++i )
    {
        if( pTmrInstance -> timer_ids[ i ] == uID )
        {
            pTmrInstance -> Fire_Elapsed( i );
            break;
        }
    }
    return;
}


Nu blijkt dat de gebouwde executable al bij het eerste timer event crashed, terwijl in de VB ontwikkelomgeving alles wel goed gaat.

Dit grapje hebben we nog een keer herhaald, maar dan mbv een ( zwaargewicht) MFC ActiveX. ( Een control :( )

Wat blijkt, deze crashed ook in de executable, maar alleen als er in de eventfuntie een variant gebruikt wordt. 8)7

Het lijkt er dus op dat VB er niet goed tegen kan om vanuit een losse thread events te krijgen, terwijl hij ook allerlei COM functies aanroept.

Wie heeft er een idee, of pointers waar dit aan kan liggen ?

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.


Verwijderd

gokker de gok, de thread waarin je je even fired is niet de thread waarop het component gecreert is terwijl je in 'n single threaded apartment zit?

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 24-08 22:38
Idd.

Ik had hier
http://support.microsoft....kb/articles/q196/0/26.asp

en hier
http://support.microsoft....aspx?scid=kb;EN-US;157437

gevonden waarom het niet kan.

Blijkt dat je een hidden window moet aanmaken in je component, en die vanuit de 2e thread een user message sturen.

Vervolgens kan vanuit daar het event gekicked worden.

Een nadeel is dat je er een extra communicatieslag tussen hebt zitten. Dit gaat weer ten koste van je nauwkeurigheid.

Naja, je kan niet alles hebben ....

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.


Verwijderd

In het Q article noemen ze als eerste oplossing je sink interface te marshallen, als je dat window geen mooie oplossing vind doe je dat toch?