MFC/Serial & Socket 2010. 12. 17. 11:55

CSingleLock Base Class 없습니다.

CSingleLock 클래스 객체 다중 스레드 프로그램 리소스에 대한 액세스 제어 사용되는 액세스 제어 메커니즘 나타냅니다.

동기화 클래스 CSemaphore, CMutex, CCriticalSection, 그리고 CEvent 사용하기 위해서는,  당신은 CSingleLock 또는 CMultiLock Object 하나를 동기화 객체를 기다려야 합니다. CSingleLock 사용자가 번에 하나의 객체를 기다릴 사용하고  CMultiLock 여러 개의객체가 있을 특정한 시간에 사용할 있습니다.


CSingleLock 개체 사용하려면 관리 리소스의 클래스 멤버 함수 내부 생성자 호출합니다. 그런 다음 리소스 사용할 있는지 확인하려면 IsLocked 멤버 함수 호출합니다. 경우, 멤버 함수 나머지 계속합니다. 리소스 사용할 수없는 경우, 릴리스 수있는 리소스에 대한 지정된 시간 금액 또는 반환 실패 기다립니다. CSingleLock 개체를 다시 사용하거나 CSingleLock 개체 파괴될 있는 경우 리소스 사용 잠금 해제 함수를 호출하거나, 완료됩니다.

CSingleLock 개체 CSyncObject에서 파생 개체의 존재를 필요로합니다. 이것은 보통 관리 리소스 클래스의 데이터 멤버입니다.

 
class CSingleLock
{
// Constructors
public:
 CSingleLock(CSyncObject* pObject, BOOL bInitialLock = FALSE);
// Operations
public:
 BOOL Lock(DWORD dwTimeOut = INFINITE);
 BOOL Unlock();
 BOOL Unlock(LONG lCount, LPLONG lPrevCount = NULL);
 BOOL IsLocked();
// Implementation
public:
 ~CSingleLock();
protected:
 CSyncObject* m_pObject;
 HANDLE  m_hObject;
 BOOL    m_bAcquired;
};
/////////////////////////////////////////////////////////////////////////////
// CMultiLock



class CMultiLock
{
// Constructor
public:
 CMultiLock(CSyncObject* ppObjects[], DWORD dwCount, BOOL bInitialLock = FALSE);
// Operations
public:
 DWORD Lock(DWORD dwTimeOut = INFINITE, BOOL bWaitForAll = TRUE,
  DWORD dwWakeMask = 0);
 BOOL Unlock();
 BOOL Unlock(LONG lCount, LPLONG lPrevCount = NULL);
 BOOL IsLocked(DWORD dwItem);
// Implementation
public:
 ~CMultiLock();
protected:
 HANDLE  m_hPreallocated[8];
 BOOL    m_bPreallocated[8];
 CSyncObject* const * m_ppObjectArray;
 HANDLE* m_pHandleArray;
 BOOL*   m_bLockedArray;
 DWORD   m_dwCount;
};

'MFC > Serial & Socket' 카테고리의 다른 글

Server에서 멀티소켓 관리하기  (0) 2010.11.29
Thread를 사용해서 Socket관리하기  (0) 2010.11.29
:
MFC/Microsoft Foundation Class 2010. 11. 29. 12:29

SENDMESSAGE POSTMESSAGE 그리고 POSTTHREADMESSAGE

 

LRESULT SendMessage( UINT message, WPARAM wParam = 0, LPARAM lParam = 0 );

BOOL PostMessage( UINT message, WPARAM wParam = 0, LPARAM lParam = 0 );

원형은 같지만 차이점이 존재한다.

SendMessage 메시지 큐에 메시지를 추가하지 않고 관련된 메시지의 함수를 직접 호출하고 결과를 반환하는 함수.

PostMessage hWnd윈도우의 메시지 큐에 바로 리턴하므로 메시지를 붙인 즉시 다른작업을 있지만 다른 메시지가 있으면 뒤에 붙인 메시지는 곧바로 처리되지 않는다.

 

바로 처리해야 메시지가 아니면 Post 바로 처리해야 하면 SendMessage 사용

 

결론:

PostMessage:메시지 큐에 메시지를 추가하고 앞의 메시지가 완료된 처리

SendMessage:메시지 큐를 거치지 않고 메시지 핸들러 함수를 호출하여 곧바로 처리

PostThreadMessage : 쓰레드에 보내는 메시지고 나머지는 위와 같음
<Thread는 잘 모르겠네...미확실>

 


:
MFC/Microsoft Foundation Class 2010. 11. 29. 12:17

현재 접속중인 Socket IP주소 가져오기

 


CString CIntSocket::GetUserIP()

{

           CString ip = _T("");

           UINT _port;

           GetPeerName(ip,_port);

           return ip;

}

 

 

자신의 IP주소 가져오기

 

CString GetLocalIP()

{

           WORD wVersionRequested;

           WSADATA wsaData;

           char name[255];

           CString ip; // 여기에 lcoal ip가 저장됩니다.

          

           PHOSTENT hostinfo;

           wVersionRequested = MAKEWORD( 2, 0 );

          

           if ( WSAStartup( wVersionRequested, &wsaData ) == 0 )

           {

        if( gethostname ( name, sizeof(name)) == 0)

        {

                                if((hostinfo = gethostbyname(name)) != NULL)

                                {

                                          ip = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);

                                }

        }     

        WSACleanup( );

           }

           return ip;

}

 


CString
변수에 특정 글자의 개수 카운트

int GetFindCharCount(CString msg,char find_char)

{

           int msg_len = msg.GetLength();

           int find_cnt = 0;

          

           for(int i =0 ; i<msg_len ; i++)

           {

                     if(msg[i] == find_char)

                     {

                                find_cnt++;

                     }

           }

           return find_cnt;            

}



특정 글자의 앞까지 String 가져오기

void CClientSock::RECEIVE_LOGINLIST()

{

           CSockThread* p = GetPointerTH(m_pThread);

           CDENT_MSG_CLIENTDlg* dlg = GetPointerDLG(m_pWnd); 

           CString tempStr;

           CString Buf;

           char* buf = new char[1024+1];

           memset(buf,0x00,sizeof(buf));

           Receive(buf,1024+1);    

           Buf = buf;

           int f_cnt;

           f_cnt = GetFindCharCount(Buf,'#');

           for(int i =0 ; i < f_cnt ; i++)

           {

                     AfxExtractSubString(tempStr,Buf,i,'#');

                     dlg->SendMessage(UPDATE_MEMBER,(WPARAM)&tempStr,(LPARAM)0                  tempStr = _T("");

           }

           DWORD re =dlg->SendMessage(THREAD_UPDATE,0,0);

           delete buf;

}

AfxExtractSubString(저장버퍼,원본데이터,인덱스,기준 문자)

: