2014-07-26 5 views
0


answer을 기반으로 내 스레드를 주 스레드와 동기화 할 수 있습니다. 그리고 덕분에 answer 나는 매개 변수도 전달할 수 있습니다. 그러나 문제는 매개 변수가 다르기 (카운트 또는 유형) 때문에 여러 프로 시저에 대해 여러 클래스를 선언해야한다는 것입니다.TIdSync 익명 함수 사용

Q : 익명 함수를 TIdSync (또는 다른 솔루션)와 함께 사용할 수 있으므로 다양한 절차에 대해 여러 클래스를 정의 할 필요가 없습니까? TThread.Synchronize()TThread.Queue() 자신 익명 절차를 지원하기 때문에 중복 것 같은

답변

2

TIdSyncTIdNotify는 익명의 절차/기능을 지원하지 않습니다 (그리고 그들은 당신이 비 RTL 작업 할 때하는 TThread 객체를 필요로하지 않는 정적 과부하가 스레드). 예를 들어 :

procedure TMyThread.Execute; 
begin 
    ... 
    Synchronize(
    procedure 
    begin 
     SomeFunction(Param1, Param2, Param2); 
    end 
    ... 
    Queue(
    procedure 
    begin 
     SomeFunction(Param1, Param2, Param2); 
    end 
); 
    ... 
end; 

// CreateThread() procedure 
function MyThreadProc(pv: Pointer): DWORD; stdcall; 
begin 
    ... 
    TThread.Synchronize(nil, 
    procedure 
    begin 
     SomeFunction(Param1, Param2, Param2); 
    end 
); 
    ... 
    TThread.Queue(nil, 
    procedure 
    begin 
     SomeFunction(Param1, Param2, Param2); 
    end 
); 
    ... 
    Result := 0; 
end; 

TIdSyncTThread.Queue() 단지 래퍼입니다 TThread.Synchronize()TIdNotify 단지 래퍼입니다. 모든 TThread을 사용할 수 있었던시기에 비 익명의 비 익명의 Synchronize() 메서드가 도입되었습니다. TThread에 정적 메서드 및 익명 프로 시저가 도입되어 이제는 TIdSyncTIdNotify이 수행하도록 설계된 모든 작업이 수행되어 관련성이 낮아집니다 (물론 여전히 작동합니다).

+0

감사합니다. 좋은 정보. 늦은 답변 죄송합니다. 그러나 'SomeFunction'은 예상대로 실행되지 않습니다. 'SomeFunction' (또는'SomeFunction'가 가끔씩 실행 됨)에 의해 수신되지 않는 패킷들입니다. 또한 'SomeFunction'은 TIdSync 접근 방식과 함께 훌륭하게 작동했습니다. 또한 그것은 Synchronize와 함께 작동했습니다. 내가 마지막으로 코멘트에있는이 [link] (http://delphi.about.com/b/2011/04/14/synchronizing-threads-and-gui-in-delphi-application.htm)에서 약간 검색했습니다. 마이클 슈넬 (Michael Schnell)의'TThread.Queue'에 대한 통지이지만, 어떻게 돌봐야하는지 이해하지 못합니다. 감사. – SAMPro

+0

'TIdSync'는 단순히'TThread.Synchronize()'를 호출합니다. 'TThread.Queue()'는'TThread.Synchronize()'가 사용하는 것과 같은 큐를 사용합니다. 그들은 둘 다 메인 쓰레드가 여유있게 처리 할 수 ​​있도록 글로벌 대기열에 요청을 보냅니다. 그래서'SomeFunction()'이 호출되지 않으면 메인 쓰레드는 동기화 요청을 처리하지 않고'TThread','TIdSync' 및'TIdNotify'에 똑같이 영향을 미칩니다. –