2011-12-20 1 views
0

저는 C++ 및 MFC와 함께 실시간으로 Bloomberg에서 정보를 가져올 응용 프로그램을 만듭니다. 블룸버그 API는 블룸버그의 업데이트를 "구독"하고이를 실시간으로 내 PC로 전송할 서브 스크립 션 클래스를 가지고 있으므로 블룸버그 데이터를 처리하기 위해 스레드에서 이벤트 루프를 실행해야한다.MFC에서 멀티 스레딩을 구현하여 외부 함수가 액세스 할 수있는 내부 사전을 업데이트합니다.

대역폭을 절약하기 위해 블룸버그 시세 표시기를 마지막 가격으로 매핑하기 위해 동일한 시세 표시기 (예 : 여러 번 동일한 시세 표시기가 있음)를 여러 개 얻는 대신 사전 프로그램은 사전에서 조회를 수행합니다. 그런 식으로, 나는 단지 별개의 시세 표를 구독해야만한다.

이전에는 멀티 스레딩을 사용하지 않았으며 MSDN의 설명서를 읽었지만 지금해야 할 일을 이해하는 데 많은 어려움을 겪고 있습니다.

내 이해에 따라 AfxBeginThread()를 사용하여 작업자 스레드를 만들고 사전 인스턴스에 대한 포인터를 전달해야합니다. 작업자 스레드는 내 프로그램이 실행되는 동안 사전을 업데이트합니다.

이 사전은 스레드에 의해 잠겨 있습니까? 업데이트되는 동안 안전하게 액세스 할 수 있습니까?

프로그램이 종료 될 때까지 백그라운드에서 실행중인 스레드를 그대로 둘 수 있습니까? 프로그램을 종료 할 때 명시 적으로 스레드를 삭제해야합니까, 아니면 자동으로 수행됩니까?

이 소리가 맞습니까? 아니면 뭔가 근본적인 것이 누락 되었습니까?

그래서 시세 및 가격을 저장하기 위해 CMap (CString, LPCSTR, double, double)을 만들었습니다. 나는 LPVOID를 통해 CMap에 대한 포인터를 전달하고 CMap은 실시간으로 업데이트된다. 이것은 모두 지금 일하고있다. CMap 내에서 변수를 조회하여 실시간 가격을 얻을 수 있습니다.

그러나 지금은 'thread-safe'가 아닙니다. 이제까지 CMap에 쓰는 단 하나의 스레드 만 있고, 다른 모든 것들은 CMap에서 데이터를 읽는 것입니다. 그래서 지금은 큰 문제가 아닙니다.

그러나 좋은 프로그래밍 방법을 배우려면 CMap에 쓸 때 CEvent를 사용해야합니까? CEvent는 스레드로 전달되어야합니까? 어떻게 구현되는지 잘 모르겠습니다. 나는 빠른 구글 검색을했고, 스레드 내에서 변수를 잠 그거나 잠금 해제하는 방법을 이해하지 못했습니다.

+0

이 질문은 꽤 광범위합니다. 얼마나 많은 도움을 받을지 확신하지 못합니다. 나는 당신에게 시작하려고 노력하는 답변에서 가장 좋은 기회를 주었지만, 그 조언을 읽고 그것을 시도하기 시작하는 것이 가장 좋습니다. _specific_ 질문을 게시 할 수 있다면 도움을받을 가능성이 훨씬 더 높습니다. – Chad

답변

1

스레드 안전성을 위해 특별히 설계되지 않은 개체는 그렇지 않습니다. 따라서 당신은 당신의 "사전"의 액세스를 보호하는 몇 가지 뮤텍스 객체가 필요합니다 : 문서가 위의 경우에 CSemaphore을 제안

// for example, HINT CCriticalSection, or CSemaphore 
mutex.lock(); 
dictionary.add(...); 
mutex.unlock(); 

동안, CCriticalSection는 (제 생각에)입니다 쉽게 초보자에 대한 이해.

응용 프로그램이 시작하는 스레드는 응용 프로그램에서 중지해야합니다 (예). 작업이 완료된 스레드에 신호를 보내면됩니다.

// for example, HINT CEvent 
while(!stopped) 
{ 
    do_work(); 
} 

응용 프로그램 종료시 stopped 이벤트를 설정하십시오.

처음에는 here을 읽으십시오. 솔직히, 이것들은 꽤 기본적인 질문이지만, 실제로 이런 것들을 잘 배우는 데 시간을 할애 할 준비를하십시오.적절한 멀티 쓰레딩 코드를 작성하는 것이 쉬운 경우라면 누구나 할 수 있습니다.

앞서 언급 한 특정 동기화 클래스에 대해서는 here에 대해 설명되어 있습니다.

관련 문제