25. juni 2001 - 14:26Der er
15 kommentarer og 1 løsning
PostThreadMessage
Problemstilling:
I mit program har jeg en ImportThread som henter data fra en Lotus Notes database. Hver gang et dokument indlæses så notificeres min maintråd vha. PostMessage. Det fungerer upåklageligt.
Nuvel - jeg har i mit program også en ExportThread som skal opdaterer en anden database. I Import trådens Execute procedure kalder jeg denne tråd således: PostThreadMessage(MyExportTråd.handle, WM_MYMESSAGE,0,0).
Delphi Dokumentationen anbefaler at man løser problemet med den manglende (default) Message Kø ved at kalde sleep og derefter PostThreadMessage indtil den aktuelle Message er placeret i modtager trådens kø. Hmm, det virker ikke og får højst mit program til at kører i en uendelig løkke.
I Min Exporttråd ser koden sådan ud:
PeekMessage(Msg,0,0,0, PM_NOREMOVE); while (not Terminated) do begin Sleep(10); if PeekMessage(Msg,0,0,0, PM_REMOVE) then begin DMsg.Msg :=Msg.message; DMsg.wParam:=Msg.wParam; DMsg.lParam:=Msg.lParam; DMsg.Result:=0; Dispatch(DMsg); end; end;
Jeg skal for en god ordens skyld understrege at Tråd objektet er oprettet og kører. Men ingen af PeekMessage kaldene får tilsyneladende hente nogle message - sandsynligvis fordi der ikke er en message kø.
Er der nogle som har en ide til afhjælpning af denne problemstilling?
kegel> Behøver du bruge messages? Kan du ikke bare sætte en variabel i Exportthreaden? Så tjek denne variabel i stedet. Du kan evt. indsætte nogle threadsafe-funktioner som Lock og Unlock, så der ikke opstår memory access problemer...
cms> - en variabel, hmm. Så er hele ideen med anvendelse af en separat eksporttråd vel dybest set overfløding? Hvorfor - fordi importtrådens tempo jo vil være afhængig af eksporttrådens behandlings hastighed. Fordelen ved at sende en message til eksport tråden er jo at importtråden kan fortsætte indlæsningen uanfægtet af hastigheden på eksporttråden.
Dit løsningsforslag er nu ikke helt umuligt fordi man selvsagt selv kan implementere en kø struktur. Men umiddelbart er jeg nu mest stemt for at anvende messages.
martinlind> - Indrømmet, din løsning har jeg endnu ikke afprøvet.
For det første fordi løsningen helst skal indebære anvendelse af message.
For det andet siger dokumentationen at en message tråd først oprettes når man anvender en USER/GDI objekt. Mig bekendt er en mailslot ikke en USER/GDI objekt, men et Kernel Objekt?
For det tredje er jeg ikke helt sikker på, hvad du præcist mener med TCP/IP. Jeg kunne selvsagt godt oprette en TCP forbindelse mellem de to tråde, men det virker ærlig talt som voldsom overkill.
Men OK, hvis der ikke kommer andre og bedre bud så er dit forslag da værd at undersøge nærmere.
kegel> Hvis du har \"adgang\" til \"The Delphi Magazine\" så kig i March 2001 (side 18-32), hvor du finder en glimrende artikkel: \"Threadded Inner-Process Communication\"
Martinlind> Jeg har løst problemet, men må med bedrøvelse konstaterer, at jeg faktisk ikke ved hvordan/hvorfor! Jeg har faktisk gennemført alt nedenstående uden held tidligere - men et eller anden må jeg jo have gjort ;-)
Nuvel - just for the record:
1) Opret Import tråd suspended 2) Opret Export tråd suspended 3) kald resume metoden på export tråden 4) Send en \'dummy\' message efterfulgt af sleep til Exporttråden - altså som:
5) kald Import trådens resume metode 6) I Import trådens execute metode kan man nu sende messages til exporttråden
Export trådens execute metode ser således ud:
procedure TExportThread.Execute(); var Msg : TMsg; begin GetMessage(Msg, 0, 0, 0); while (not Terminated) do begin getMessage(Msg, 0,0,0); PostMessage(MainTread.handle, Msg.message, Msg.wparam, 0); end; end;
Jeg har accepteret dit svar pga. din ihærdighed for at finde en løsning - tak for hjælpen.
PS: Jeg er bestemt interesseret i at læse omtalte artikel. Min mail adresse er jkl@nykredit.dk.
martinlind> Jeg undrede mig også over hvordan du kunne scanne til PDF? Hvis jeg ikke husker helt galt så er det omkring August/September at der skulle komme en ny skive med de seneste artikler - TDM er undværlig :-)
Jeg tog selv og scannede denne til JPG men hele artiklen fylder på denne måde fylder den 7-8 MB
Det er jeg klar over, men efter som du ikke nævnte størrelsen på din PDF så regnede jeg med at den ikke fyldte alverden. Hvis jeg \"printer\" min JPG til PDF så vil jeg umiddelbart ikke tro at der er noget at spare.
Jeg prøvede at føre siderne (jeg havde scannet) over i Word, men der skulle \"for meget manuelt arbejde\" til, før det blev brugbart.
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.