06. juni 2007 - 18:12Der er
5 kommentarer og 1 løsning
QueueUserAPC og beskyttelse af APCProc
Jeg har et problem i et 2 trådet program jeg er ved skrive. Min main tråd sender beskeder til den den anden tråd med QueueUserAPC, hvilket som sådan virker fint.
Problemet er at jeg får 2 beskeder lige efter hinanden, lad os kalde dem A og B. Jeg modtager altså A og lige efter B. Problemet er at de kommer i hvert deres kald til QueueUserAPC og det betyder at tråden begynder på at udfører det den skal for besked A, men inden den er færdig, så modtager den B og laver et software interrupt, som så begynder på at lave B inden A er færdig.
Jeg tænkte først jeg kunne tvinge den til at færdigøre A, inden den lavede næste besked, ved at bruge Critical Sections, men det virker ikke når det er i samme tråd.
Nogen der har gode løsningsforslag? Busy waiting etc. er selvf. ikke brugbart, da det bare vil blokere tråden og ikke sørge for at A bliver kørt færdig.
Der er som sådan ikke andre krav til kommunikationen, end at min main tråd skal kunne sende en besked til min anden tråd og så skal main tråden ellers være fri til at lave andet. (Main tråd har GUI osv. og der er en del blokkerende kald i den anden tråd. Jeg skal dog ikke kommunikere tilbage til min main tråd.)
Grunden til at jeg valgte at bruge QueueUserAPC er at tråden ikke har et vindue, så jeg kan ikke bruge SendMessage og PostMessage. Jeg overvejede at bruge Events i stedet, men så skulle jeg enten oprette en del forskellige events eller finde en anden måde at kommunikere hvilken type event der var tale om. Og QueueUserAPC tager jo et DWORD som argument, så det var lige til...
PostThreadMessage kunne nok bruges i stedet, og virker så vidt jeg kan se fra MSDN på ca. samme måde. (Det jeg gør nu, er at have min tråd i en tråd_main funktion, og så i WaitForSingleObjectEx() på min program luk event. Det skal nok bare laves om til at være et GetMessage loop)
Jeg viste ikke at en worker thread kunne have en message kø, men det er tæt på logisk når man ved det. PostThreadMessage og et message pump skulle løse mit problem.
Jeg undre mig dog lidt over hvordan det er meningen man skal bruge QueueUserAPC. Der står det er implementeret som en FIFO, men det hjælper ikke meget når 2 forskellige kald afbryder hinanden.
Må blive en anden gang jeg kikker nærmere på APC problem stilligen. Jeg tror kun jeg har set et enkelt andet sted hvor det har været brugt, så er umiddelbart ikke den mest alm. måde at kommunikere på. Det er i hvert fald ikke lavet med det formål, som jeg først antog.
Tak for hjælpen.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.