com : 다른 스레드에서 호출하면 충돌이 발생합니다. 같은 스레드에서 실행하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/199972

  •  11-07-2019
  •  | 
  •  

문제

나는 다른 스레드에서 이벤트를받는 BHO (IE를위한 확장)를하고 있습니다. 다른 스레드에서 DOM에 액세스하면 충돌이 발생합니다. 충돌하지 않도록 메인 BHO 스레드와 동일한 스레드에서 DOM에 액세스 할 수 있습니까?

그것은 일반적인 com multithreading 문제처럼 보이며, 나는 많이 이해하지 못합니다.

도움이 되었습니까?

해결책

사용을 살펴보십시오 Comarshalinterface 또는 Comarshalinterthreadinterfaceinstream

이들은 스레드 안전한 STA COM 객체에 대한 랩핑 된 인터페이스를 제공합니다.

다른 팁

IE 확장에 대해 많이 알지 못하지만 일부 COM 객체에 단일 스레드 아파트로 표시되어야하는 것처럼 들리므로 COM 런타임 시스템은 처음에 호출 한 것과 동일한 스레드에서 실행되도록합니다. 다른 객체를 변경할 수 없다면, 동일한 효과를 달성하기 위해 STA로 표시된 별도의 COM 객체를 통해 호출을 DOM으로 라우팅 할 수 있습니다. 이것이 도움이되기를 바랍니다 ... 나는 com multithreading에 대해 조금 알고 있지만, IE 확장에 대해서는별로 알고 있지 않습니다.

아, com과 함께 재미있는 재미있는 멀티 스레딩.

제랄드의 대답 인터페이스 포인터를 한 스레드에서 다른 스레드로 정확히 한 번 전송하려면 옳습니다. Git (Global Interface Table)은 멀티 스레드 시스템에 있다면 이런 종류의 도움이된다는 것을 알았습니다 ... 기본적으로 인터페이스 포인터를 유지하지 않고 GIT가 사용하는 DWORD 쿠키를 유지합니다. 사용중인 스레드에 대해 적절하게 매끄러운 인터페이스 포인터를 얻으십시오. (문제의 객체를 먼저 GIT에 등록하고 나중에 끝나거나 객체가 완료되면 등록 해제해야합니다).

그래도 조심하십시오. 성능은 심각한 문제가 될 수 있습니다.

BHO에 대해 배우기 위해 놀고 있다면 STA를 사용하여 :: setSite () 구현 객체 구현 마치 단일 스레드가있는 것처럼 작동하도록 할 수 있습니다 (이를 통해 다른 스레드가 BHO의 포인터를 GlobalInterFacetable에서 끌어낼 수 있습니다. @jasons가 언급 한대로.

제품의 일부가 될 것으로 예상되는 일을하고 있다면 MTA를 어디든 가고 동시성 및 실 안전 문제를 직접 처리하는 것이 매우 신중하게 재고하는 것이 좋습니다. 이 경우 BHO COM 객체와 상호 운영하는 스레드가 COM을 초기화하는지 확인하면됩니다.

예를 들어, 웹 사이트의 들어오는/나가는 데이터를 모니터링하려면 (위험하거나 민감한) 웹 사이트를 찾는 경우 (위험하거나 민감한), Yahoo를 예제로 사용하기 때문에 모든 스레드를 STA 객체의 목구멍 아래로 강요하고 싶지 않습니다. 30 개가 넘는 요청이 시작되고 BHO가 IE를 잠그기 시작합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top