모든 상황을 모르니까.. 추측하게 되는데요.
제 생각도 문제는 synchronize 에 있는 것 같습니다.
VCL 에서 synchronize의 동작은 Main Thread의 특정 큐에 synchronize에서 전달받은 함수포인터를
전달받은 후에 postmessage를 Main Thread에 보내게 됩니다.
그 이후에 Main Thread가 CheckSynchronize 가 호출되어 전달받은 함수포인터를 통해 지정된 함수를 실행하게 됩니다. 그 이후 다시 사용자의 thread로 넘어가게 됩니다.(동기화가 되는 것이죠.)
VC로 만든 MFC 기반 프로그램에선 VCL과 달리 이런 작업을 하는 녀석이 없으므로 synchronize 호출 이후
전달된 함수포인터를 처리하는 루틴이 없으므로 계속 대기하게 되는 것입니다.
전체적인 구조를 바꿀 수 없다면 DLL 에서 synchronize를 사용하지 말고 callback 통해 처리 함수, 즉 mfc 프로그램내 함수를 호출하고 MFC 프로그램 내에서 동기화 하는 방법을 사용하셔야 할 것 같습니다.
아니면 synchronize 관련 루틴을 MFC 프로그램과 DLL 내부에 직접 만들어 사용하셔야 하는데, 일이 좀 크겠네요. 이건.
도움이 되기를 바랍니다.
Gromit 님이 쓰신 글 :
: 답변 감사합니다. 방금 스레드만 생성하는 dll만들어서 해봤습니다.
: 그런데 synchronize()를 사용하면 역시 VC++에서 스레드가 멈춥니다.
: 그러나 synchronize()를 사용하지 않으면 잘 작동은 됩니다.
:
: 하지만 원래 제 소스에 synchronize를 없애면 역시 멈추게되는군요...
:
:
:
:
:
: 남병철.레조 님이 쓰신 글 :
: : 흠... 쓰레드만 생성하는 DLL을 만들어서 생성하는 호출을 해보세요.
: : 정말 쓰레드 동작이 멈춘건지...
: : 그리고 VC++ 쪽의 프로젝트 속성에 멀티쓰레드를 지원하도록 설정 되어있는지 등등...
: : 부분부분 분해하여 버그나 오류 지점을 찾아야 할 듯 합니다.
: :
: :
: :
: : Gromit 님이 쓰신 글 :
: : : C++ Builder에서 dll을 생성하였습니다. 처음에 나오는 use vcl 이나 멀티스레드 모두 체크했구요.
: : :
: : : 만들어낸 dll은 내부에서 스레드를 사용하고있구요.(소켓통신도 합니다.)
: : :
: : :
: : : 이 dll을 C++빌더에서 만들어낸 main_builder.exe에서 LoadLibrary()로 불러서 돌리면
: : :
: : : 소켓통신/스레드 모두 잘 돌아갑니다. 정상적으로 작동하구요.
: : :
: : :
: : : 그런데 Visual Studio 2005 mfc로 만든 main_mfc.exe 에서 돌리면
: : :
: : : 소켓통신이나 다른 함수들(메시지처리같은) 은 정상작동하지만
: : :
: : : 유독 스레드만 정상적으로 돌아가지 않는 현상이 발생합니다.
: : :
: : : 스레드가 정지(!)해 있습니다 더이상 처리를 안하구요...
: : :
: : :
: : :
: : : 혹시나 해결하신분 계시면 꼭 좀 도와주세요~
|