Avatar billede kegel Nybegynder
25. juni 2001 - 14:26 Der 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?
Avatar billede martinlind Nybegynder
25. juni 2001 - 14:31 #1
Prøv at bruge en Mailslot / TCP/IP / UPD eller lign. til at starte dine tråde med.

MailSlot kan hentes her :

www.djernaes.dk/martin/vcl.html
Avatar billede cms Nybegynder
26. juni 2001 - 01:42 #2
*gg*
Avatar billede cms Nybegynder
26. juni 2001 - 01:45 #3
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...
Avatar billede kegel Nybegynder
26. juni 2001 - 08:37 #4
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.
Avatar billede martinlind Nybegynder
26. juni 2001 - 09:43 #5
Så brug noget TCP/IP, det virker fint også i en tråd.
Avatar billede kegel Nybegynder
26. juni 2001 - 10:24 #6
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.


Avatar billede martinlind Nybegynder
26. juni 2001 - 10:44 #7
Det virker ihvert fald, der hvor en message ikke virker, har selv brugt det til debug og den slags.

Måske du skulle overveje at bruge en Mailslot.

Meeen der er faktisk en demo med til delphi, med noget InterProcess Comm. det kunne du jo overveje at kaste et blik på Demos\\IpcDemos

/Martin
Avatar billede kegel Nybegynder
26. juni 2001 - 10:51 #8
Blot for en god ordens skyld:

PostThreadMessage(MyExportTråd.handle, WM_MYMESSAGE,0,0);

er forkert, det skal selvsagt være:

PostThreadMessage(MyExportTråd.ThreadId, WM_MYMESSAGE,0,0);

Det løser nu ikke problemet, men ...
Avatar billede pellelil Nybegynder
26. juni 2001 - 18:21 #9
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\"
Avatar billede martinlind Nybegynder
26. juni 2001 - 19:14 #10
kegel >> hvis du ikke har kan du droppe en mailadr. så skal jeg sende den til dig imorgen (pdf )
Avatar billede kegel Nybegynder
27. juni 2001 - 09:24 #11
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:

PostThreadMessage(MyExportTråd.ThreadId, WM_MYMESSAGE,0,0);
Sleep(0)

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.
Avatar billede martinlind Nybegynder
27. juni 2001 - 09:41 #12
Jeg var vist lidt for hurtig, den er for ny til jeg har fået den som PDF, men jeg har et link du måske kan bruge :

Multithreading - The Delphi Way

http://www.pergolesi.demon.co.uk/prog/threads/ToC.html

Takker for point\'ne

/Martin
Avatar billede pellelil Nybegynder
27. juni 2001 - 10:46 #13
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
Avatar billede martinlind Nybegynder
27. juni 2001 - 11:05 #14
Hvis du har en fuld Acrobat, kan du printe til en PDF.
Avatar billede pellelil Nybegynder
27. juni 2001 - 11:09 #15
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.
Avatar billede martinlind Nybegynder
27. juni 2001 - 11:20 #16
Han må nøjes med linket, til vi får 2001 cd\'en
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