2015-05-26 41 views
2

我正在使用XE8,並試圖構建一個我的真實世界應用程序的例子。德爾福-OTL-線程池和工作線程之間的通信

我需要在主「服務線程」和OTL線程池之間進行通信。 這些例子都是用窗體和監視器設置的。我不需要這些,但我無法弄清楚寫一個乾淨的代碼的方法。到目前爲止,這是我做過什麼:

TProcessWorker = Class(TOmniWorker) 
strict private 
    FTaskID : int64; 
    FIndex : Integer; 
    FFolder : String; 
protected 
    function Initialize: Boolean; override; 
public 
    procedure WriteTask(var msg : TMessage); message _AM_WriteTask; 
End; 

{ TProcessWorker } 

function TProcessWorker.Initialize: Boolean; 
begin 
    FTaskID := Task.UniqueID; 
    FIndex := 0; 
    result := True; 
    FFolder := Format('%s/%d', [Task.Param['Folder'].AsString, FTaskID]); 
    ForceDirectories(FFolder); 
end; 

實現爲:

procedure TProcessWorker.WriteTask(var msg: TMessage); 
var 
    ps : PString; 
    L : TStringStream; 
begin 
    Ps:= PString(msg.LParam); 
    L := TStringStream.Create(ps^); 
    try 
    L.SaveToFile(format('%s\%d.txt',[FFolder, fIndex])); 
    finally 
    l.Free; 
    inc(FIndex); 
    end; 
end; 

在主線程,創建池,我打電話:

FThreadPool := CreateThreadPool('Thread pool test'); 

var 
    lFolder : String; 
    Process : IOmniWorker; 
begin 
    lFOlder := ExtractFilePath(ParamStr(0)); 
    Process := TProcessWorker.Create; 
    CreateTask(Process, 'Task test').Unobserved.SetParameter('Folder',lFolder).Schedule(FThreadPool); 

我不知道如何正確調用我的工作者線程。在我的真實應用程序中,會觸發多個線程,並且我需要確保正確使用線程池。

1)通過像我這樣調用CreateTask,我如何正確使用threadpool?爲我需要的每個進程調用CreateTask似乎很奇怪。

2)工作線程永遠不會被觸發。我應該如何讓我的工作線程工作! :)

問候, 克萊門特

回答

0

檢查http://otl.17slon.com/book/doku.php?id=book:howto:connectionpool

我的感覺是,OTL是基於數據的容器,而不是線程。

所以我認爲你需要創建一個任務請求的隊列,你的「主線程」將注入任務。

池的想法是,他們管理自己!你不應該與特定的工作線程進行通信,你只需要將工作請求發送給它,然後讓該池產生/殺死工作線程,因爲它認爲合適。

如果您需要每個特定線程的反饋,我寧願將TForm.Handle或TOmniMonitor指針包含到任務請求記錄中,並使工作線程回調並與表單通信,否則線程

0

OmniThreadLibrary測試08_RegisterComm顯示如何在兩個線程之間直接通信。

基本上,您必須創建IOmniTwoWayChannel的實例,並在工作人員的Initialize方法中使用Task.RegisterComm(<channel>)註冊其端點。

然後,您可以發送郵件在「正常」的方式與<channel>.Send(<message>, <data>),他們將被分派到其他任務的消息的方法,如果你在德爾福的方式裝飾它:

procedure MessageHandler(var msg: TOmniMessage); message <message>;