2014-11-22 2 views
0

OTL 멀티 스레드 프로그램을 실행하는 동안 UI가 정지합니다. 1에서 16 개의 스레드로 테스트 한 결과, 프로 시저 시작 직후 UI가 정지합니다.Delphi OTL 멀티 스레드 UI가 작동하지 않습니다.

Parallel.ForEach(0, CalcList.Count-1) 
    .NumTasks(nMax) 
    .NoWait 
    .Execute(
    procedure(const value: integer) 
    begin 
    CalcUnit.EntrySearch(value); 
    end) 

OmniEventMonitor가 모든 스레드 메시지를 올바르게 수신했습니다. 모든 스레드가 닫히면 OmniEventMonitor는 수신 된 모든 메시지를 한 번에 처리합니다. 얼어서 해상도를 찾는 원인을 어떻게 결정할 수 있습니까? Application.ProcessMessages 및/또는 OmniTED.ProcessMessagesOmnitEventMonitorTaskMessage에 영향을 미치지 않습니다. MCVE에 대한

: mainform에 :

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    Parallel.ForEach(0, 1) 
    .Execute(
    procedure(const value: integer) 
    begin 
     CalcUnit.EntrySearch; 
    end); 
end; 

CalcUnit

procedure EntrySearch; 
var 
    I : integer ; 
begin 
    for I := 1 to 10 do begin 
    MessageBeep(MB_ICONEXCLAMATION); 
    Sleep(1000) ; 
    end; 
end; 

CalcUnit이 완료 될 때까지 MainForm이 정지합니다.

+1

왜 'ProcessMessages'를 호출할까요? 우리는 MCVE를 가질 수 있을까요? –

+0

@DavidHeffernan 빠른 답장을 보내 주셔서 감사합니다. ProcessMessages를 사용하여 메인 스레드를 고정 해제하려 했음 (작동하지 않음) –

+1

"unfreeze (해제)"라는 용어는 때때로 "프로그래밍에 의한 프로그래밍"이라고도합니다. 'ProcessMessages'가 무엇을 사용하는지 이해하는 것이 중요합니다. 오용은 미묘한 문제의 악몽으로 이어질 수 있습니다. .... 왜 당신의 UI가 얼어 버린 지요? 그것은'CalcUnit.EntrySearch' 메쏘드 안의 어떤 것 때문일 것입니다. –

답변

0

모든 스레드가 완료 될 때까지 대기 중이므로 응용 프로그램 UI가 정지합니다. 작업 완료시 ForEach 인터페이스를 파괴해야했습니다. MainForm의 OnStop 메서드를 사용하여 마지막 스레드를 제거합니다. 살펴보기 : Incrementing Progress Bar from a ForEach Loop

{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); 
관련 문제