Avatar billede dyrby Nybegynder
30. juli 2002 - 13:53 Der er 12 kommentarer

Threads og et par gode råd.

info: Visual Studio 6 MFC c++

Jeg har et program som af og til skal hente nogle oplysniger fra en elektronisk kalender. Dette foregår igennem en dll fil som indeholder hele indterfacen til Kalender systemet. Dll skal selvfølgelig initailisres ved prg. start. Mit ønske er at lave en tråd som tager sig af denne initalisering, samt fremtidig kommunikation med calendaren. Grunden er at al kommunikation med denne calendar tager LANG tid, og jeg vil gerne have at mit hoved program skal køre videre mens den laver forespørgsler til kalenderen. når der så er et resultat klar, skal "kalendertråden" eks. via. "PostMessage()" videregive informationerne til hovedtråden som så kan behandle dem som det er meningen. Forløbigt har jeg lavet en tråd således
    CRuntimeClass* prt = RUNTIME_CLASS(OBCalendarThread);
    pCalThread = AfxBeginThread(prt);
    pCalThread->m_bAutoDelete = FALSE;
    pCalThread->PostThreadMessage(WM_THREAD_START_MIN_TRAAD, 0, (LPARAM)this);


men på denne måde laver jeg jo en "User-Interface" og det er jo ikke det jeg har? men jeg vil gerne have message pumpen så jeg senere kan bede om oplysninger gennem denne eks:
PostThreadMessage(WM_THREAD_GET_APPOINTMENTS, 0, (LPARAM)args);
hvor den så svare tilbage på samme måde.

Dette virker! men jeg har problemer med at få afsluttet tråden rigtigt. Jeg får memory leeks da jeg kalder tråden med argument-pointere som jeg senere i tråden laver delete på. Når jeg så afslutter tråden, er det ikke altid at disse beskeder bliver behandlet. og dermed heller ikke deletet.
Nå men nok om hvordan jeg gør (spg hvis du er uklar om noget). jeg vil abere gerne høre om der er andre der har levet noget lig. eller har et overblik over om jeg gør det på en meget uhensigts messig måde? hvis ja.. hvordan gør jeg så? jeg giver mange point for dette og forventer derfor også et svar som er længere end feks: "brug worker threads" på fårhånd tak! dyrby
Avatar billede jpk Nybegynder
30. juli 2002 - 14:20 #1
Jeg skal lige være sikker på, at jeg har forstået det rigtigt:
1) Du har en UI tråd oppe at køre.
2) Du kan sende messages til tråden, som du modtager i trådens message loop.
3) Du kan sende messages return fra tråden.
Avatar billede dyrby Nybegynder
30. juli 2002 - 15:01 #2
Det er rigtigt... mit "problem" er at det ikke er en UI som denne tråd behandler. Det er et interface til en dll. når jeg f.eks. i min CWinApp skal bruge clandar info for en betemt bruger gør jeg noget i retning af: minTråd->PostThreadMessage(WM_MIN_GET_CAL_FUNKTION, 0, (WPARAM)miniArgs);

i trådens GetCal() laver jeg så en delete på "miniArgs" (stuct) og en new på et "minRes" stuct

Når denne beskeden er færdig behandlet poster jeg en beked tilbage til min CWinApp på nogenlunde denne måde: minHovedAppTråd->PostThreadMessag(WM_MIT_RESULTAT_CAL_FUNKTION, 0, (WPARAM)minRes);

Det virker.... meeen jeg har fornemmelsen af at det ikke er sådan man bør gøre.. da det jo ikke er en UI tråd jeg har brug for?
Avatar billede dyrby Nybegynder
30. juli 2002 - 15:03 #3
Du må siger hvis jeg ikke giver detaljer nok :)
Avatar billede jpk Nybegynder
30. juli 2002 - 15:10 #4
Man kunne jo lave en worker thread for hver "opslag" i kalenderen, men jeg ved ikke om din kalender er thread safe..?

Du behøver forresten ikke:
CRuntimeClass* prt = RUNTIME_CLASS(OBCalendarThread);
pCalThread = AfxBeginThread(prt);
men kan blot gøre således:
pCalThread = AfxBeginThread(RUNTIME_CLASS(prt));
Avatar billede jpk Nybegynder
30. juli 2002 - 15:27 #5
Hvis du gerne vil have message loopet, ser jeg ingen problemer i at anvende en UI Thread, men hvorfor sætter du bAutoDelete til FALSE?
(Hvis du endelig vil det, bør du "create" tråden i suspended mode, sætte værdien til false og så resume tråden...)
Avatar billede dyrby Nybegynder
30. juli 2002 - 15:30 #6
Det smarte ved at lave det med message køen var jo lidt at man var sikker på at interfacen altid "kun" tilgåes via én tråd, dermed behøver jeg ikke bekymre mig om den er threadsafe eller ej?

med hensyn til det andet... mener du så ikke (i mit tilfælde altså) :
pCalThread = AfxBeginThread(RUNTIME_CLASS(OBCalendarThread)); ? :)
Avatar billede jpk Nybegynder
30. juli 2002 - 15:31 #7
Jo, undskyld (copy/paste)
Avatar billede jpk Nybegynder
30. juli 2002 - 15:32 #8
Jeg tror også jeg foretrækker fremgangsmåden med en enkelt tråd...
Avatar billede jpk Nybegynder
30. juli 2002 - 15:36 #9
Hvis du sætter "m_bAutoDelete = FALSE", skal du huske explicit at kalde "delete pCalThread;"...
Avatar billede dyrby Nybegynder
30. juli 2002 - 15:51 #10
ok... Kan du oplyse mig om hvorfor man har lyst til at bruge "m_bAutoDelete = FALSE" ? jeg satte den nærmest fordi jeg havde indtryk af at den ellers ville lukke ned uden jeg havde kontrol med det... :| men det går den da ikke kan jeg se :) jeg laver dog selv en delete på min tråd.. så det er ikke noget prob.
Avatar billede jpk Nybegynder
30. juli 2002 - 15:56 #11
Hvis du laver en worker thread der har bAutoDelete = true, sletter tråden sig selv, så snart den er færdig med sin workfunction. En UI tråd gør ligeså, når den modtager en WM_QUIT message.
Hvis du dog ønsker at bruge en funktion som fx:
BOOL GetExitCodeThread(
  HANDLE hThread,      // handle to the thread
  LPDWORD lpExitCode  // termination status
);
er det jo ikke så smart hvis tråden har slettet sig selv...
Avatar billede dyrby Nybegynder
30. juli 2002 - 16:47 #12
Tak! Jeg vender tilbage i morgen... med et par spg. jeg har nemlig stdig prb. med memmory leeks ...:(
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