2010-11-30 4 views

답변

3

주 스레드를 제외한 모든 스레드에서 VCL 개체를 수정하지 않는 것과 동일한 규칙이 여기에서도 유효합니다. OnExecute 이벤트 처리기에서 VCL 컨트롤을 변경하면 안됩니다.이 코드는 모든 연결에 대해 Indy에서 작업자 스레드 스폰 컨텍스트로 실행되기 때문에 변경해야합니다.

그래픽 사용자 인터페이스를 변경해야하는 경우 동기화 또는 대기열 방법을 사용하거나 그래픽 사용자 인터페이스를 변경하기 위해 주 스레드에 알리기 위해 사용자 정의 알림 메커니즘을 사용하십시오. 당신이 동기화 또는 대기열 메서드를 호출 할 경우

, 당신은 TIdYarn에서 유래와 쓰레드를 구현 TIdYarnOfThread에 TIdYarn을 캐스팅 입력 할 필요가 :

// Calling MyMethod using Synchornize inside TIdTcpServer.OnExecute event-handler 
TIdYarnOfThread(AContext.Yarn).Thread.Synchronize(MyMethod); 


// Calling MyMethod using Queue inside TIdTcpServer.OnExecute event-handler 
TIdYarnOfThread(AContext.Yarn).Thread.Queue(MyMethod); 
+3

Tthread 정적 동기화()와 큐() 메소드가 D7 +에서는 원사 내부에 직접 액세스 할 필요가 없습니다. 또는 Indy의 TIdSync 및 TIdNotify 클래스를 대신 사용하십시오.이 클래스는 이러한 세부 정보를 처리합니다. –

+0

@Remy, thanks; 특히 Indy의 TIdSync 및 TIdNotify의 경우; 나는 그들에 대해 몰랐다. – vcldeveloper

+0

TidSynch는 주 vcl 스레드가 종료 될 때까지 대기하고 작업자가 주 vcl 스레드에서 tidsynch 메서드를 기다리는 경우 교착 상태가 발생할 수 있으므로 TidNotify를 가장 잘 사용합니다. – MikeT

관련 문제