我正在使用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)工作線程永遠不會被觸發。我應該如何讓我的工作線程工作! :)
問候, 克萊門特