LRESULT CThreadTestDlg::OnCloseThread( WPARAM wParam, LPARAM lParam ) { CloseHandle( m_hThread ); if( m_step < 2 ) { m_step++; CreateWorkThread( this->GetSafeHwnd(), m_step ); } return 0; }
void CThreadTestDlg::test() { HWND hWnd = this->GetSafeHwnd(); // 准备 PrepareWork( hWnd ); // 开始执行 m_step = 1; CreateWorkThread( hWnd, m_step ); }
void XESocketClientInServer::ConnectThread() { SOCKADDR_IN addr; addr.sin_family = AF_INET; addr.sin_port = htons(m_Port); addr.sin_addr.S_un.S_addr = inet_addr(m_strcIP.c_str()); { // 루프진입하기전에 대기(TryConnect()에서 스레드 생성하자마자 진입해서 한번 막음. XAUTO_LOCK; } while(1) { if( connect( m_Socket, (struct sockaddr *)&addr, sizeof(addr) ) == 0 ) { XAUTO_LOCK; CreateWorkThread(); Set_bConnected( TRUE ); // 연결상태로 만든다. return; // 스레드 종료 } // 커넥트에 실패했으면 if( m_Socket == 0 ) return; Sleep( 1000 ); // 1초쉬고 다시 시도 } }
/** @brief @param numWorkThread 0이면 시스템 코어에 맞춰 자동 */ void XEWinSocketSvr::Create( WORD port, int numWorkThread ) { XBREAK( port == 0 ); if( XWinNetwork::sStartUp() == false ) { XALERT( "WSAStartup failed" ); return; } // // m_Socket = socket( AF_INET, SOCK_STREAM, 0 ); m_Socket = WSASocket( PF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED ); if( m_Socket == INVALID_SOCKET ) { XALERT( "create socket failed" ); return; } SOCKADDR_IN addr; addr.sin_family = AF_INET; addr.sin_port = htons( port ); addr.sin_addr.S_un.S_addr = htonl( INADDR_ANY ); if( bind( m_Socket, ( struct sockaddr * )&addr, sizeof( addr ) ) == SOCKET_ERROR ) { XBREAK(1); XALERT( "Network bind error" ); Destroy(); return; } // m_Port = port; // 클라로부터 접속을 받을 준비 if( listen( m_Socket, SOMAXCONN ) == SOCKET_ERROR ) { XALERT( "Network::listen error" ); Destroy(); return; } // m_pUserMng = CreateUserMng( m_maxConnect ); XBREAK( m_pUserMng == NULL ); // 유저 커스텀 create OnCreate(); // virtual // IOCP 객체 생성 m_hIOCP = CreateIoCompletionPort( INVALID_HANDLE_VALUE, NULL, 0, 0 ); // 워커 스레드 생성 SYSTEM_INFO si; memset( &si, 0, sizeof(si)); GetSystemInfo( &si ); #if defined(_DEBUG) && !defined(_XBOT) const int numThread = 4; // 개발중엔 편의상 스레드 적게쓴다. #else const int numThread = (numWorkThread == 0)? (int)(si.dwNumberOfProcessors * 2) : numWorkThread; #endif XBREAK( numThread <= 0 || numThread > 32 ); for( int i = 0; i < numThread; ++i ) { m_aryThreadWork.push_back( CreateWorkThread() ); } // accept( 클라이언트로부터의 접속대기 ) 스레드 생성 m_thAccept = CreateAcceptThread(); // #if _DEV_LEVEL <= DLV_OPEN_BETA m_timerSec.Set( 1.f ); #endif }