Avatar billede tokelil Nybegynder
06. juni 2007 - 18:12 Der 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.

På forhånd tak
Avatar billede bertelbrander Novice
06. juni 2007 - 23:12 #1
Hvorfor bruger du QueueUserAPC?
Hvad er kravene til kommunikationen?

Jeg ville bruge SendMessage eller PostThreadMessage, der får du funktionen umiddelbart.
Avatar billede tokelil Nybegynder
06. juni 2007 - 23:27 #2
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)
Avatar billede bertelbrander Novice
06. juni 2007 - 23:39 #3
Jeg har et meget simpelt eksempel med PostThreadMessage:
http://damb.dk/snip/thread.html
Avatar billede tokelil Nybegynder
07. juni 2007 - 11:17 #4
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.

Anyway, smid et svar og tak for hjælpen!
Avatar billede bertelbrander Novice
07. juni 2007 - 23:18 #5
Jeg har ikke bruget APC, så jeg ved ikke...
Jeg samler ikke på point.
Avatar billede tokelil Nybegynder
07. juni 2007 - 23:23 #6
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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester