27. oktober 2000 - 00:14Der er
5 kommentarer og 1 løsning
Udveksling af data mellem tråde
Hej!
Jeg er en totalt Delphi-amatør, som lige har lavet mit første multithreadede program. Som selvfølgelig er totalt genialt. Det er et flerbruger system, og til det formål bruger jeg multithreading, altså hvor jeg opretter en ny tråd til at tage sig af hver bruger. Mit problem er nu, hvordan sender man nemmest beskeder frem og tilbage mellem trådene?
Jeg vil for eksempel i flere forskellige tråde sende en \"status-opdaterings\"-besked, som så skal fanges i en \"log\"-tråd, som evt. skal skrive en linie i en tekstfil, sende en alarm via e-mail til min mobil, eller lign..
Jeg har også flere forskellige \"Session\" tråde, som hver holder styr på én bruger, der har noget kørende med systemet. En gang imellem skal denne tråd så sende noget information til en anden tråd, og andre tråde skal sende noget tilbage hertil..
Spørgsmålet er nu, hvordan udveksler jeg nemmest data mellem de forskellige tråde? Er der indbygget funktionalitet i Delphi til at kommunikere imellem trådene? Hvordan gør man!!!!!
Det nemmeste må vel være via Windows (alm.) MessageSystem: PostMessage / SendMessage men netop fordi din tråd ikke skal vente på at modtageren har bebandled meddelelse så vil jeg foreslå PostMessage.
Når du sender en \"besked\" (Message) så skal du bruge flg. parametre: BOOL PostMessage( HWND hWnd, // handle of destination window UINT Msg, // message to post WPARAM wParam, // first message parameter LPARAM lParam // second message parameter );
Hvor HWND er window handleren til de vindue hvor meddelelsen skal sende, Msg er en uniqe \"unsigned integer\" der gør det muligt at skille de enkelte meddelelser fra hinanden, WPARAM og LPARAM er de (Word og LongInt) \"parametre\" der kan være i en tråd.
Når du skal definere din Msg variabel så gøre dette påbaggrund af (den af Borland) prædefinerede constant WM_USER. Du kan således skrive (husk at uses \"Messages\"): <SNIP> const WM_MinMeddelese = WM_USER + 1; </SNIP>
Måden du poster din meddelese er (i dette tilfælde til Form1): <SNIP> PostMessage(Form1.Handle, WM_MinMeddelelse, 0, 0); </SNIP>
I den form hvis event handler der skal fange den meddelelse indsætter man en procedure til at \"fange meddelelse\". Procedure defineres i interface som: <SNIP> type TForm1 = class(TForm) // bla. bla. Procedure WMMinMeddelelse(var Msg: TMessage); message WM_MinMeddelelse; end; </SNIP>
I implementation delen skriver du \"indholdet\" af proceduren så den gør det du vil have den til: <SNIP> Procedure TFormMainMenu.WMMinMeddelelse(var Msg: TMessage); begin // Gør noget end; </SNIP>
Hvis du vil bruge ovenstående så kan du lade dine tråde create et object der indeholder de oplysninger som skal føres over til den anden tråd\'s form. Du kan således lade LPARAM delen af meddelelsen indeholde en pointer til dette object. Du får ingen problemer med syncronisering, fordi det er kun den enkelte tråd der kender til objectet mens det creates, og når meddelelsen er sendt så er det kun modtager tråden der bekymre sig om den (det er således også denne der skal dispose den når den er færdig).
Ja ok det lød måske lidt arrogant så vi prøver igen. Jeg har ikke lavet en masse DLL\'er men jeg har da et og til lavet et par stykker i det omgang det er nødvendigt. Lad mig høre hvad du vil vide så må vi se om jeg kan svare eller om vi skal have en anden på banen.
Hmm, jeg laver et program der kan en masse fancy ting over SMS... Det ville være fedt at kunne sende SMS\'er gennem ICQ\'s sms gateway..
Så det jeg ville vide var, om du vidste hvordan man kalder ICQ message api DLL\'ens SendExternal (idet jeg antager at det er den funktion man skal bruge til at sende gennem icq plug-ins? eller ikke?)...
Alternativet er vel at aflure protokollen og så bare selv forbinde sig til deres server osv.. Jeg har kigget lidt på den, den ser ret simpel ud.. indeholder tiden og ens ICQ nummer og resten af kommunikationen er rent tekstbaseret. Men den sluger altså ikke mine pakker når jeg prøver selv at kontakte den - den sender et eller andet fjuttelihut tilbage :o) (jeg antager at det er en fejlmeddelelse).. Jeg tror måske at man skal sende fra den samme tcp port som ICQ er logget på icq netværket med... det er det eneste jeg kunne få øje på som jeg har gjort forskelligt fra icq... bortset fra tcp sekvens nummeret...
Anyway, det er en ret stor mundfuld for mig, så det ville være en del nemmere hvis jeg bare kunne kalde deres DLL og så få fyret en SMS af. Det kunne være ret fedt.
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.