답변 감사드립니다.
저도 해결방법은 danga80님말대로 하는게 좋을거라고 생각합니다.
가능하면 간단하게 만든 소스를 정리해서 올려보겠습니다.
danga80 님이 쓰신 글 :
: 모든 상황을 모르니까.. 추측하게 되는데요.
:
: 제 생각도 문제는 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 에서 돌리면
: : : :
: : : : 소켓통신이나 다른 함수들(메시지처리같은) 은 정상작동하지만
: : : :
: : : : 유독 스레드만 정상적으로 돌아가지 않는 현상이 발생합니다.
: : : :
: : : : 스레드가 정지(!)해 있습니다 더이상 처리를 안하구요...
: : : :
: : : :
: : : :
: : : : 혹시나 해결하신분 계시면 꼭 좀 도와주세요~
|