【說明】
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;