BCB로 만든 dll에서 TThread를 Create하기전에
Application->CreateHandle();
을 한번 호출해봐 주세요
Application->CreateHandle();
dll을 load한후에 딱 한번만 호출해주면 됩니다.
문제가 해결된다면
이유와 원리는 나중에 팁/강좌 게시판에 올리도록 하겠습니다.
그럼..
Gromit 님이 쓰신 글 :
: 해결 했습니다!
:
: 아니, 해결했다는 말은 어울리지 않네요.
:
: dll로 만들때 스레드를 사용하려면 절대 synchronize()를 사용하면 안됩니다.
: 저 함수를 사용하는순간 c++builder에서는 잘 돌아갈지 몰라도 vc++계열에서 로드하면
: synchronize()가 정상적으로 작동하지 않는군요.
: 그냥 멈춰버립니다(대기상태가 되어버립니다.)
:
: 혹시 dll만들때 스레드동기화 문제 겪으시는분 계시면 synchronize()함수 문제일 가능성이 큽니다~
: 조심하세요~
:
:
: Gromit 님이 쓰신 글 :
: : 답변 감사드립니다.
: : 저도 해결방법은 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 에서 돌리면
: : : : : :
: : : : : : 소켓통신이나 다른 함수들(메시지처리같은) 은 정상작동하지만
: : : : : :
: : : : : : 유독 스레드만 정상적으로 돌아가지 않는 현상이 발생합니다.
: : : : : :
: : : : : : 스레드가 정지(!)해 있습니다 더이상 처리를 안하구요...
: : : : : :
: : : : : :
: : : : : :
: : : : : : 혹시나 해결하신분 계시면 꼭 좀 도와주세요~