|
자답을 하는것 같습니다.
하위 스레드에서 VCL 을 생성할때 Ownner 를 Application 으로 하지 말고 NULL 로하니까
오류가 나지 않는것 같습니다.
스레드가 워낙 빨라서인지 Application을 참조하지 못하는 경우가 있나 봅니다. 그게 아니라면 이것도
Synchronize 해야 하는것이 아닌지 모르겠습니다. 아무튼 해결된것 같습니다.
FSocket = new TClientSocket(Application); --> FSocket = new TClientSocket(NULL);
권상득 님이 쓰신 글 :
: 빈번하게 생성되고 파괴되는 Thread 안에서 TClientSocket 을 Create 시키면.
: 처음에는 별무리 없이 소켓을 잘 만들고 사용후 정상적으로 파괴됩니다.
: 일정 시간이 경과되고 나면 소켓 Create 시 오류가 나기 시작하고.
: 그 발생 간격이 점차 좁아지면서 너무 자주 오류가 납니다. 다행이 Create 시 Try 문을 사용하여
: 오류를 검출하고 Free 시겨주는 것으로 데드락까지 가는것을 막기는 하였으나
: 근본적인 해결방법은 없는가요?
:
: 사용환경 :
: C++Builder 5.0 , FastMM , IsMultiThread = True , SetThreadAffinityMask(GetCurrentThread(), 1)
: IBM XSeris 365 , Intel(R) Xeon(TM) MP CPU 2.0GHz 듀얼, 3.50GB RAM, 하이퍼쓰레딩 사용
:
: 소스구현부분...
: main.cpp-------------------------------------
: void __fastcall TMain::FormCreate(TObject *Sender)
: {
: SetThreadAffinityMask(GetCurrentThread(), 1);
: IsMultiThread = True;
: }
:
: void __fastcall TMain::MakeThread(TObject *Sender)
: {
: ThreadMy *JobMy; //TThread 를 상속받아 만들었음...
: try {
: JobMy = new ThreadMy();
: if (JobMy == NULL) {
: ShowMessage(FormatDateTime("hh:mm:ss",Now()) + " -> " + Data + ", Thread Create Error!!!");
: } else {
: JobMy->OnTerminate = ThreadDone;
: }
: } catch(...) {
: ShowMessage(FormatDateTime("hh:mm:ss",Now()) + " -> " + Data + ", Thread Create Error!!!");
: }
: }
:
: ThreadMy.cpp-------------------------------------
: __fastcall ThreadMy::ThreadMy() : TThread(False)
: {
: FreeOnTerminate = True;
: FTerminate = false; //전역변수
:
: try {
: FSocket = new TClientSocket(Application);
: FSocket->OnError = FSocketError;
: FSocket->OnDisconnect = FSocketDisconnect;
: FSocket->Address = "127.0.0.1";
: FSocket->Port = 3000;
: FSocket->ClientType = ctBlocking;
: } catch(...) { FTerminate = true; }
: }
:
: void __fastcall ThreadMy::Execute()
: {
: if (!FTerminate) {
: 쓰레드안에서 할일들을 합니다..
: }
:
: try {
: if (FSocket != NULL) FSocket->Free();
: } catch(...) { }
: }
|