程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> [DIOCP3-IocpTask說明書]基於IOCP引擎的多線程任務的投遞和回調處理單元,iocp模型

[DIOCP3-IocpTask說明書]基於IOCP引擎的多線程任務的投遞和回調處理單元,iocp模型

編輯:Delphi

[DIOCP3-IocpTask說明書]基於IOCP引擎的多線程任務的投遞和回調處理單元,iocp模型


【說明】

IocpTask是基於Iocp引擎的多線程任務投遞和處理單元,可以方便的把任務進行投遞到IOCP線程進行統一調度和處理,是模仿QDAC-QWorker的處理方式,支持D7以上的版本。

【使用方法】

使用上很簡單,下面解釋一種比較全面的方法:

procedure PostATask(pvTaskWork:TOnTaskWork;
       pvTaskData:Pointer = nil;
       pvRunInMainThread:Boolean = False;
       pvRunType:TRunInMainThreadType = rtSync);overload;

 

參數:

   pvTaskWork 

       回調函數,procedure(pvTaskRequest: TIocpTaskRequest) of object;  pvTaskRequest可以訪問到傳入的taskData,strData等信息。

  pvTaskData

      是傳入的數據,為指針類型,可以是任何的數據,在回調函數中可以通過pvTaskRequest對象進行獲取得到。

pvRunInMainThread:

      回調函數是否在主線程中運行,考慮到一些需要訪問主線程界面的任務,需要在主線程中運行。

pvRunType:

     同步的方式,支持兩種,一種是rtSync是使用線程的同步模式,rtPostMessage,使用消息 + Event等待的模式。消息模式考慮到dll中同步方法無法使用時可以采取的同步方式。

 

【注意事項】

     主窗體銷毀時,很多資源都已經被銷毀,如果此時有投遞需要主線程處理的任務,可能會導致主線程掛起,而整個進程無法結束的情況。

 

destructor TfrmMain.Destroy;
begin
  FLogTask.PostATask(onLogMsg, 'abcd', True, rtPostMessage);
  Sleep(100);
  FLogTask.Active := false;
  FLogTask.Free;
  inherited Destroy;
end;

上面的代碼會導致程序無法退出,FLogTask.PostATask(onLogMsg, 'abcd', True, rtPostMessage); 是投遞到主線程執行的任務,這個時候主窗體正在銷毀,無法相應PostMessage的消息(Synchronize方式也是一樣會堵塞)導致FMessageEvent會一直等待下去,所以需要注意的是在主窗體銷毀的時候不要進行主線程任務的投遞。可以在主窗體的destroy中,可以禁止相應投遞任務, 在主窗體析構函數的開始,設置Enable := false; 這樣iocpTask不會再處理任何的任務,注意是析構函數的第一句,不是窗體的FormDestory事件。

destructor TfrmMain.Destroy;
begin
  FLogTask.Enable := false;
  iocpTaskManager.Enable := False;

  .....

  inherited Destroy;
end;



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved