2014-04-08 8 views
1

처음으로 OTL을 사용하고 있으며 Async/Await 추상화를 사용하려고했습니다.OTL에서이 오류가 발생하는 이유는 무엇입니까?

이제 어떤 일이 발생하는지보기 위해 작은 프로그램을 만들었습니다. 그것은 단지 버튼 일 뿐이며이 절차를 호출합니다.

procedure TForm2.Button1Click(Sender: TObject); 
var i : integer; 
begin 
Button1.enabled := false; //Only for second try 

for i := 0 to 100 do 
begin 

Async(
    procedure begin 
    sleep(5000); 
end). 
Await(
    procedure begin 

    //First Try - Button1.Enabled := true; 

    //Second Try - showmessage('finished') 

    end 
); 

Button1.enabled := true; //Only for the second try. 

    end; 
end; 

첫째, 그것은 잘 처음 작동이 들어

을 시도 asyncs의 버튼, 수면을 해제 한 다음 다시 할 수 있습니다.

버튼을 두 번째 클릭해도 사용할 수 없지만 다시 활성화되지는 않습니다.

둘째

내가 메시지 × 100 시간을 보여주고 싶었이 시간을 시도하고는 처음 aswell을 작동하지만 다시 프로 시저를 호출 할 때 다음과 같은 오류를 얻을 TOminCommunicationEndpoint.Send: Queue is full

수있는 사람이 누가 이 라이브러리를 사용해 보았습니다. 왜이 오류가 발생합니까? 그리고 그것이 첫 번째 시도와 관련된 문제라면?

+0

디버거에서이 코드를 실행하면 문제를 알려주는 예외가 발생합니다. 제공된 도구를 사용하는 습관을 갖춰야합니다. 디버거가 유용합니다. –

답변

2

OTL의 내부 제한 사항에 부딪 힐 것 같습니다.

Async-Await을 호출 할 때마다 새 스레드가 시작되고 즉시 반환됩니다. 루프가 완료되면 100 개의 스레드로 끝나며 각각 Await 코드를 실행하기 전에 5 초 동안 대기합니다.

AFAIK, 스레드 풀을 사용할 때 OTL에 60 개의 동시 스레드 제한이 있습니다.

+0

이것은 사실 일 수 없습니다. N 개의 숨겨진 로컬이있는 경우 루프 반복 당 하나씩 스택 프레임 크기가 컴파일 타임에 알려지지 않습니다. 하나의 숨겨진 로컬이 있어야합니다. –

+0

@DavidHeffernan, 당신 말이 맞아요. OTL의 한계로 인해 나는 여전히 답을 찾았습니다. –

+1

스레드 제한은 사용자 정의 할 수 있어야합니다. 그보다 더 관례없는 코어를 가진 기계를 가진 고객이 있습니다. 나는 그것이 Primoz에 대한 질문이라고 생각합니다. –

관련 문제