C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[60086] Re:Re:Re:Re:Re:Re:DLL에서 스레드 사용시에 Visual C++계열에서 문제가 생깁니다~
장성호 [nasilso] 6535 읽음    2010-02-01 10:34
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 에서 돌리면
: : : : : :
: : : : : : 소켓통신이나 다른 함수들(메시지처리같은) 은 정상작동하지만
: : : : : :
: : : : : : 유독 스레드만 정상적으로 돌아가지 않는 현상이 발생합니다.
: : : : : :
: : : : : : 스레드가 정지(!)해 있습니다 더이상 처리를 안하구요...
: : : : : :
: : : : : :
: : : : : :
: : : : : : 혹시나 해결하신분 계시면 꼭 좀 도와주세요~

+ -

관련 글 리스트
60066 DLL에서 스레드 사용시에 Visual C++계열에서 문제가 생깁니다~ Gromit 3701 2010/01/30
60067     Re:DLL에서 스레드 사용시에 Visual C++계열에서 문제가 생깁니다~ 남병철.레조 3213 2010/01/30
60068         Re:Re:DLL에서 스레드 사용시에 Visual C++계열에서 문제가 생깁니다~ Gromit 4766 2010/01/30
60070             Re:Re:Re:DLL에서 스레드 사용시에 Visual C++계열에서 문제가 생깁니다~ danga80 3813 2010/01/30
60072                 Re:Re:Re:Re:DLL에서 스레드 사용시에 Visual C++계열에서 문제가 생깁니다~ Gromit 3747 2010/01/31
60085                     Re:Re:Re:Re:Re:DLL에서 스레드 사용시에 Visual C++계열에서 문제가 생깁니다~ Gromit 2673 2010/02/01
60086                         Re:Re:Re:Re:Re:Re:DLL에서 스레드 사용시에 Visual C++계열에서 문제가 생깁니다~ 장성호 6535 2010/02/01
60098                             Re:Re:Re:Re:Re:Re:Re:DLL에서 스레드 사용시에 Visual C++계열에서 문제가 생깁니다~ danga80 2264 2010/02/01
60099                                 Re:Re:Re:Re:Re:Re:Re:Re:DLL에서 스레드 사용시에 Visual C++계열에서 문제가 생깁니다~ 장성호 3226 2010/02/01
60090                             Re:Re:Re:Re:Re:Re:Re:DLL에서 스레드 사용시에 Visual C++계열에서 문제가 생깁니다~ Gromit 2525 2010/02/01
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.