首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delphi OTL多线程UI冻结

Delphi OTL多线程UI冻结
EN

Stack Overflow用户
提问于 2014-11-23 04:56:40
回答 1查看 628关注 0票数 0

在执行我的OTL多线程程序期间,UI冻结。使用1到16个线程进行测试,UI在过程开始后立即冻结。

代码语言:javascript
复制
  Parallel.ForEach(0, CalcList.Count-1)
  .NumTasks(nMax) 
  .NoWait
  .Execute(
   procedure(const value: integer)
   begin
     CalcUnit.EntrySearch(value);
    end)

所有线程消息都会被OmniEventMonitor正确接收。当所有线程都关闭时,OmniEventMonitor一次处理所有收到的消息。我如何确定冻结的原因以找到解决方案。OmnitEventMonitorTaskMessage中的Application.ProcessMessages和/或OmniTED.ProcessMessages没有影响。

对于MCVE:在mainform上:

代码语言:javascript
复制
procedure TForm1.Button1Click(Sender: TObject);
begin
  Parallel.ForEach(0, 1)
  .Execute(
     procedure(const value: integer)
     begin
       CalcUnit.EntrySearch;
     end);
 end;

在CalcUnit上

代码语言:javascript
复制
procedure EntrySearch;
var
   I : integer ;
begin
  for I := 1 to 10 do begin
    MessageBeep(MB_ICONEXCLAMATION);
    Sleep(1000) ;
   end;
 end;

在CalcUnit完成之前,MainForm会冻结。

EN

回答 1

Stack Overflow用户

发布于 2014-11-26 15:53:20

应用程序UI冻结,因为它正在等待所有线程都已完成。我不得不在任务完成时销毁ForEach接口。使用MainForm中的OnStop方法销毁最后一个线程。查看:Incrementing Progress Bar from a ForEach Loop

代码语言:javascript
复制
{Private declarations}
FWorker : IOmniParallelLoop<integer>;

FWorker := Parallel.ForEach(0, CalcList.Count-1)
.TaskConfig(Parallel.TaskConfig.OnMessage(Self))
.NumTasks(nMax) 
.NoWait
.OnStop(procedure (const task: IOmniTask)
  begin
  task.Invoke(procedure begin
      FWorker := nil;
    end);
  end);

FWorker
.Execute(
  procedure (const value: integer)
  begin
     CalcUnit.EntrySearch(value);
  end);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27082455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档