AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Thread Synchronize für TIdHTTPServer OnCommandGet
Thema durchsuchen
Ansicht
Themen-Optionen

Thread Synchronize für TIdHTTPServer OnCommandGet

Offene Frage von "berens"
Ein Thema von berens · begonnen am 17. Jan 2008 · letzter Beitrag vom 17. Jan 2008
Antwort Antwort
berens

Registriert seit: 3. Sep 2004
431 Beiträge
 
Delphi 2010 Professional
 
#1

Thread Synchronize für TIdHTTPServer OnCommandGet

  Alt 17. Jan 2008, 10:24
Hi!

Folgendes Problem: Ich habe mit dem TIdHTTPServer bei OnCommandGet eine Prozedur geschrieben, die je nach ausgewählter Website eine entsprechende Prozedur hinterlegt. Funktioniert soweit ganz gut.

Das Problem ist, dass dieses Prozeduren nicht aus dem MainThread, sondern von dem des Indy-HTTP-Servers aufgerufen werden. Da die Prozeduren nicht Thread-Sicher sind, müsste ich sie nun mit Synchronize aufrufen.

Synchronize steht mir aber nicht zur Verfügung (ist ja afaik eine Prozedur von TThread und Indy ist nicht direkt ein Thread).

Wie führe ich die Prozeduren trotzdem im Mainthread aus?

Danke im Vorraus für Hilfe!
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

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

Re: Thread Synchronize für TIdHTTPServer OnCommandGet

  Alt 17. Jan 2008, 11:04
Entweder du schickst daten via Postmessage (da passen aber nur 2*32bit rein)
Oder du nimmst sendmessage (dadurch hält der Thread an und übergibst die Adresse der Prozedur/Methode)
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
berens

Registriert seit: 3. Sep 2004
431 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Thread Synchronize für TIdHTTPServer OnCommandGet

  Alt 17. Jan 2008, 11:11
Wie soll das denn in etwa aussehen?

 SendMessage(Application.Handle, CallBackObject.MeineProzedur, 0, 0); Kenn mich mit SendMessage leider absolut garnicht aus...
  Mit Zitat antworten Zitat
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
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:48 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz