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
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.
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?
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));
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...)
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)); ? :)
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.
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...
Tak! Jeg vender tilbage i morgen... med et par spg. jeg har nemlig stdig prb. med memmory leeks ...:(
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.