TIdHTTPServer的OnCommandGet事件实际上是在INDY的工作线程中执行的。有什么办法可以让这部分代码在程序的主线程中执行?

解决方案 »

  1.   

    SendMessage一个消息到主窗口,然后窗口里写上消息处理。
      

  2.   

    主窗体自定义一个同类型事件,把idhttp的该事件绑定到自定义事件,这有啥意义呢
      

  3.   

    貌似用SyncObjs.TEvent可以实现阻塞处理的功能。
      

  4.   

    代码说话unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;const
      WM_ON_HTTP_COMMAND = WM_USER + 100;type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
      private
        //响应WM_ON_HTTP_COMMAND消息
        procedure OnHttpCommand(var message: TMessage); message WM_ON_HTTP_COMMAND;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}{ 此段代码可为线程调用 }
    procedure SendOnHttpCommand;
    var
      r: Integer;
    begin
      r := SendMessage(Form1.Handle, WM_ON_HTTP_COMMAND, 0, 0); //<SendMessage阻塞执行的,3/4俩参数可以用来传递对象或者结构。
      ShowMessage(IntToStr(r));
    end;{ TForm1 }//  TMessage = packed record
    //    Msg: Cardinal;
    //    case Integer of
    //      0: (
    //        WParam: Longint;   //<WParam、LParam用来传递结构对象等
    //        LParam: Longint;
    //        Result: Longint);  //<用来传递返回值
    //      1: (
    //        WParamLo: Word;
    //        WParamHi: Word;
    //        LParamLo: Word;
    //        LParamHi: Word;
    //        ResultLo: Word;
    //        ResultHi: Word);
    //  end;
    procedure TForm1.OnHttpCommand(var message: TMessage);
    begin
      message.Result := 1;
    end;end.
      

  5.   

    晕了,回复这么多楼,居然.....用消息你们不觉得麻烦吗?给楼主一个办法,这个也是Indy的作法,也是最一般,最有效的TThread.Synchronize('你的需要在主线程中的方法')参数中是一个没有参数的对象过程,如果你要传递参数,则需要在线程对象中定义私有域变量来实现
    TThread.Synchronize(MyProc);
    Procedure TMyThread.MyProc;
    begin
       ///实际会在主线程中运行的代码
       MainThreadDo(self.Param1, self.Param2);
    end;
    Procedure TMyThread.MainThreadDo(....);
    begin
    .....
    end;
      

  6.   

    ========
    虽然结了,但我还想知道,INDY TcpServer ,UDPServer 出过什么莫名其妙的问题吗?是使用有问题还是VCL本身的问题?