Einzelnen Beitrag anzeigen

Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Thread Synchronize für TIdHTTPServer OnCommandGet

  Alt 17. Jan 2008, 17:25
So falsch war das schon mal nicht.
Sendmessage hat 4 Parameter:
1. Empfänger
2. Art der Nachricht (oder Nachrichtentyp)
3.+4. zwei frei wählbare Zahlen (bzw. je nach Nachrichtentyp von bestimmter Bedeutung)

Als Empfänger können wir Application.handle (also ein unsichtbares Fenster deines Programmes) nehmen. Das kommt jetzt auf dein Programmkonzept an. Aber in 99% der Fälle wird sich ein bestimmtes Formular-Fenster (entspr. Form1.Handle,...) besser eignen. Das liegt daran, dass du den Aufruf deiner Methode aus dem Thread ja aus irgendeiner Methode aus dem Mainthread machen musst. Da bietet sich eine Methode im Hauptformular an. Ich werde mal beides erläutern.

1. Form1.Handle
Zuerst brauchst du noch einen Nachrichtentyp. Das ist auch nur eine Integer-Zahl. Dabei sind die unteren Zahlen vorbelegt (z.B. WM_Close ist die 16, dann würdest du dein Fenster schließen). Wir suchen uns besser eine größere Zahl raus. Günstigerweise gibt es die Konstante WM_User=1024. Und ab da können wir eigene Konstanten festlegen. Wir brauchen eh blos eine Nachricht, also setzen wir unsere Konstante gleich WM_User (eigene Konstante wegen der Übersichtlichkeit)
Und als Parameter übergeben wir einfach die Adresse der Methode.
im Thread:
Delphi-Quellcode:
//"irgendwo" definieren
const WM_Sync=WM_User;

//in der Methode
sendmessage(form1.handle,WM_Sync,integer(@TCallBackObject.MeineProzedur),integer(Callbackobject));
//das Callbackobject kann auch "self" sein
//self übergeben wir auch, weil es zu einer Methode gehört
//MeineProzedur darf natürlich keine Parameter enthalten (wie bei synchronize)

//Schön wäre es noch, wenn du nicht auf form1 (oder application) aus dem Thread zugreifen musst, sondern das Handle
//irgendwie in den Thread/dessen Objekt mit übergeben kannst
Im Form1 brauchen wir jetzt eine Methode, die die Nachricht empfängt. Das sieht so aus
Delphi-Quellcode:
type TForm1=class...
       procedure GetSync(var msg:TMessage);message WM_Sync;
So, das wars schon. Durch das Sendmessage, wartet der Thread bis GetSync aus Form1 fertig ist. Und in Getsync kannst du jetzt problemlos auf den Thread zugreifen oder noch andere Methoden aufrufen
Damit brauchst du wahrscheinlich die zwei Parameter in Sendmessage gar nicht mehr, sondern wirst gleich in der richtigen Methode landen. Ansonsten kannst du jetzt msg.wparam und msg.lparam auswerten und die Methode aufrufen, die du übergeben hast.


2. Application.Handle
Lohnt sich nur, wenn du eine Methode eines Objektes aufrufen willst, welches kein Windowhandle besitzt.
Dazu musst du mit Application.HookMainWindow deine Methode anmelden. Dann kommen dort aber alle Messages an Application vorbei. Das sieht etwa so aus:
Delphi-Quellcode:
type TSpecialClass=class
       constructor create;
       destructor destroy;
       function getMessages(var msg:Tmessage):boolean;
end;

constructor ...
begin
  application.hookmainwindow(getmessages);
end;
destructor ...
begin
  application.unhookmainwindow(getmessages);
end;

function TspecialClass.getMessages(var msg:Tmessage):boolean;
begin
  if msg.msg=WM_Sync then
  begin
    DoSomething;
    result:=true;
  end
  else result:=false;
end;


end;
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat