11. april 2001 - 14:07Der er
15 kommentarer og 1 løsning
DCOM og TThread
Vigtigste spørgsmål: Jeg har en DCOM applikation hvor et antal klienter kalder serveren via DCOM. Klienternes request eksekverer så i hver sin tråd. Det fungerer altsammen udemærket, problemet opstår når serveren skal kalde tilbage til klienten. Det kan lade sig gøre at kalde tilbage fra serverens hoved VCL-tråd, men ikke fra arbejds tråde. Hvorfor? Og hvad skal jeg gøre for at løse problemet. Hvordan kan jeg kalde DCOM fra en TThread.Execute?
Ekstra spørgsmål: Hvordan sender en applikation en windows-message til sig selv? Dvs. at jeg laver en message som VCL-tråden så håndterer næste gang den proccesserer message-løkken. Kan man sende en sådan message løkke fra VCL tråden selv? Og hvordan? Kan man sende en sådan message fra en TThread (arbejdstråd)? Hvordan håndteres messagen (dvs den routes til en procedure eller noget)?
For at undgå problemet kan du vel bare lave et event der kaldes når tråden er færdig med requestet, og så lade hovedtråden sende det til klienten. Jeg kan forestille mig at det er hovedtråden der opretter klientobjekterne, og det er det der er problemet, da man ikke umidelbart kan bruge et comobject der er oprettet i en anden tråd.
CoTestThread = class class function Create: ITestThread; class function CreateRemote(const MachineName: string): ITestThread; end;
implementation
uses ComObj;
class function CoTestThread.Create: ITestThread; begin Result := CreateComObject(CLASS_TestThread) as ITestThread; end;
class function CoTestThread.CreateRemote(const MachineName: string): ITestThread; begin Result := CreateRemoteComObject(MachineName, CLASS_TestThread) as ITestThread; end;
hoejrup>>Dette eksempel kan ikke bruges som det er, da der tale om multithreading, hvilket er et mareridt at have med at gøre i com sammenhæng. Ovenstående eksempel viser hvordan man kan kalde en metode på et com object i en anden tråd, ved kalde CoInitializeEx, og marshalle interfacet. Desuden skal threading model sættes til Free
I dettte eksempel har jeg ikke brugt CoInitFlags, og jeg ved ikke om det gør nogen forskel? men jeg forstår det sådan at den skal stå før initialize. For øvrigt har jeg ikke haft mulighed for at teste eksemplet med DCom, men det burde stadig virke - held og lykke med det.
type TMyClass = class private procedure MyMessage(var Message: TMessage); message WM_MYMESSAGE;
....
procedure TMyClass.EtEllerAndet... begin SendMessage(Handle, MY_MESSAGE, 0, 0); end;
procedure TMyClass.MyMessage(var Message: TMessage); begin //kode end;
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.