首页 > 技术文章 > Omnithreadlibary学习(3)-IOmniTask异步执行SendMessage

pengshaomin 2014-08-13 17:21 原文

在任务中发送消息, 可以是函数或者对象方法

  TOmniTaskMessageEvent = procedure(const task: IOmniTaskControl; const msg: TOmniMessage) of object; 
  TOmniOnTerminatedFunction = reference to procedure(const task: IOmniTaskControl);
program main;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  System.Classes,
  OtlParallel,
  OtlTask,
  OtlTaskControl,
  OtlComm, OtlCommon,
  IdHttp,
  Web.HTTPApp,
  WinApi.Windows,
  WinApi.Messages;

const
  WM_RESULT = WM_USER;


procedure HttpGet(Host, URL: String);
 var
   http:   TIdHttp;
begin
   http := TIdHttp.Create;

  // http.Request.Host := Host;
   http.Request.Method := 'GET';
   http.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36';
   http.Request.AcceptLanguage :='zh-CN,zh;q=0.8';
   http.Get(Host + URL);

   Writeln('===================Response Header==========================');
   Writeln('Server: ' + http.Response.Server);
   Writeln('Status Code :' + http.Response.ResponseCode.ToString);
   Writeln('CharSet:' + http.Response.CharSet);
   Writeln('ContentLength:' + http.Response.ContentLength.ToString());
   Writeln('ContentType:' + http.Response.ContentType);
   http.Free;
end;


procedure LogResult(const task: IOmniTaskControl; const msg: TOmniMessage);
begin
  WriteLn(Format('异步GET: %s',
  [msg.MsgData.CastToStringDef('')]));
end;

begin
 {异步执行发送消息}
  Parallel.Async(
   procedure(const task: IOmniTask)
   var
    Msg: String;
   begin
      Writeln('Thread ID ' + GetCurrentThreadID.ToString());
      Msg := 'task1 Start';
      task.Comm.Send(WM_RESULT,  Msg);
      HttpGet('http://zh.wikipedia.org/',  String(HttpEncode('wiki/文档')));
      task.Comm.Send(WM_RESULT,  'task1 completed');
   end, Parallel.TaskConfig.Onmessage(WM_RESULT, LogResult));
  Readln;
end.

1.消息没有接收到..奇怪了

推荐阅读