我刚刚发现了OmniThreadLibrary &开始玩它。我试图启动最多不超过20个任务,并将剩下的任务发送到队列中。
为此,我修改了OmniThreadLibrary的00_Beep项目:
const
TASKS_COUNT = 100;
procedure TfrmTestSimple.btnBeepClick(Sender: TObject);
var
I: Integer;
begin
with OmniEventMonitor do
for I := 1 to TASKS_COUNT do
Monitor(CreateTask(Beep, 'Beep-' + IntToStr(I))).Schedule;
end;
procedure TfrmTestSimple.FormCreate(Sender: TObject);
begin
GlobalOmniThreadPool.MonitorWith(OmniEventMonitor);
GlobalOmniThreadPool.MaxExecuting := 20;
GlobalOmniThreadPool.MaxQueued := 0;
end;它有效,但如果我增加#的任务(即。TASKS_COUNT),比方说,7000,我得到了一个例外:
TOmniCommunicationEndpoint.Send: Queue is full
我看了我能找到的任何东西(OTL博客和论坛,示例项目,谷歌很多等等),似乎为了防止这种情况,我必须定期清空队列。
所以我试了一下,但没有用:
procedure TfrmTestSimple.OmniEventMonitorTaskTerminated(const task: IOmniTaskControl);
begin
Task.Terminate(1); // I also tried: Task.Terminate(0);
Task.Comm.Reader.Empty; // Task.Comm.OtherEndpoint.Reader.Empty; didn't work either
Task.Comm.Writer.Empty; // Task.Comm.OtherEndpoint.Writer.Empty; didn't work either
end;关于如何清空队列并避免此异常,有什么建议吗?
我知道,有些人可能会说队列中有这么多的任务是荒谬的,只需说它既不是一个假设的问题,也不是我的问题的范围来告诉我重新设计我的应用程序,此时我只需要知道OTL中排队系统的限制以及如何绕过这个限制。
提前感谢!
发布于 2012-02-25 00:34:16
这个表单post没有显示如何清空OmniThreadLibrary ThreadPool队列,但确实展示了如何为OmniThreadLibrary创建一个几乎无限的等待队列(这基本上是我的目标):
http://otl.17slon.com/forum/index.php/topic,354.0.html
谢谢你帮助我,你们真是太棒了!
https://stackoverflow.com/questions/9070142
复制相似问题