您的位置:首页 > 其它

孙鑫 lesson16 thread syn&asynchronos socket

2016-07-28 16:23 435 查看
创建事件:

事件对象也属于内核对象,包含一个使用计数,一个用于指明该事件是一个自动重置的事件还是一个人工重置的事件的布尔值,另一个用于指明该事件处于已通知状态还是未通知状态的布尔值。

有两种不同类型的事件对象。一种是人工重置的事件,另一种是自动重置的事件。当人工重置的事件得到通知时,等待该事件的所有线程均变为可调度线程。当一个自动重置的事件得到通知时,等待该事件的线程中只有一个线程变为可调度线程。

一个进程的多个线程之间的互换执行,给出的例子是售票100张,两个线程之间互相之间进行切换显示出售的票

DWORD WINAPI Fun1Proc(

LPVOID lpParameter // thread data

);

DWORD WINAPI Fun2Proc(

LPVOID lpParameter // thread data

);

int tickets=100;

HANDLE g_hEvent;

void main()

{

HANDLE hThread1;

HANDLE hThread2;

hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);

hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);

CloseHandle(hThread1);

CloseHandle(hThread2);

//g_hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);

g_hEvent=CreateEvent(NULL,FALSE,FALSE,"tickets");

if(g_hEvent)

{

if(ERROR_ALREADY_EXISTS==GetLastError())

{

cout<<"only instance can run!"<<endl;

return;

}

}

SetEvent(g_hEvent);

Sleep(4000);

CloseHandle(g_hEvent);

}

DWORD WINAPI Fun1Proc(

LPVOID lpParameter // thread data

)

{

while(TRUE)

{

WaitForSingleObject(g_hEvent,INFINITE);

// ResetEvent(g_hEvent);

if(tickets>0)

{

Sleep(1);

cout<<"thread1 sell ticket : "<<tickets--<<endl;

}

else

break;

SetEvent(g_hEvent);

}

return 0;

}

DWORD WINAPI Fun2Proc(

LPVOID lpParameter // thread data

)

{

while(TRUE)

{

WaitForSingleObject(g_hEvent,INFINITE);

// ResetEvent(g_hEvent);

if(tickets>0)

{

Sleep(1);

cout<<"thread2 sell ticket : "<<tickets--<<endl;

}

else

break;

SetEvent(g_hEvent);

}

return 0;

}

BOOL CChatDlg::InitSocket()

{

m_socket=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,0);

if(INVALID_SOCKET==m_socket)

{

MessageBox(_T("创建套接字失败!"));

return FALSE;

}

SOCKADDR_IN addrSock;

addrSock.sin_addr.S_un.S_addr=htonl(INADDR_ANY);

addrSock.sin_family=AF_INET;

addrSock.sin_port=htons(6000);

if(SOCKET_ERROR==bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR)))

{

MessageBox(_T("绑定失败"));

return FALSE;

}

if(SOCKET_ERROR==WSAAsyncSelect(m_socket,m_hWnd,UM_SOCK,FD_READ))

{

MessageBox(_T("注册网络读取事件失败"));

return FALSE;

}

return TRUE;

}

LRESULT CChatDlg::OnSock(WPARAM wParam,LPARAM lParam)

{

switch(LOWORD(lParam))

{

case FD_READ:

WSABUF wsabuf;

wsabuf.buf=new char[20];

wsabuf.len=200;

DWORD dwRead;

DWORD dwFlag=0;

SOCKADDR_IN addrFrom;

int len=sizeof(SOCKADDR);

CString str;

CString strTemp;

HOSTENT *pHost;

if(SOCKET_ERROR==WSARecvFrom(m_socket,&wsabuf,1,&dwRead,&dwFlag,

(SOCKADDR*)&addrFrom,&len,NULL,NULL))

{

MessageBox(_T("接收数据失败"));

return ;

}

pHost=gethostbyaddr((char*)&addrFrom.sin_addr.S_un.S_addr,4,AF_INET);

//str.Format("%s说 :%s",inet_ntoa(addrFrom.sin_addr),wsabuf.buf);

str.Format("%s说 :%s",pHost->h_name,wsabuf.buf);

str+="\r\n";

GetDlgItemText(IDC_EDIT_RECV,strTemp);

str+=strTemp;

SetDlgItemText(IDC_EDIT_RECV,str);

break;

}

}

void CChatDlg::OnBnClickedBtnSend()

{

// TODO: 在此添加控件通知处理程序代码

DWORD dwIP;

CString strSend;

WSABUF wsabuf;

DWORD dwSend;

int len;

((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->GetAddress(dwIP);

SOCKADDR_IN addrTo;

addrTo.sin_addr.S_un.S_addr=htonl(dwIP);

addrTo.sin_family=AF_INET;

addrTo.sin_port=htons(6000);

GetDlgItemText(IDC_EDIT_SEND,strSend);

len=strSend.GetLength();

wsabuf.buf=(CHAR*)strSend.GetBuffer(len);

wsabuf.len=len+1;

SetDlgItemText(IDC_EDIT_SEND,_T(""));

if(SOCKET_ERROR==WSASendTo(m_socket,&wsabuf,1,&dwSend,0,

(SOCKADDR*)&addrTo,sizeof(SOCKADDR),NULL,NULL))

{

MessageBox(_T("发送数据失败"));

return ;

}

}

DWORD WINAPI Fun1Proc(

LPVOID lpParameter // thread data

);

DWORD WINAPI Fun2Proc(

LPVOID lpParameter // thread data

);

int tickets=100;

CRITICAL_SECTION g_csA;

CRITICAL_SECTION g_csB;

void main()

{

HANDLE hThread1;

HANDLE hThread2;

hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);

hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);

CloseHandle(hThread1);

CloseHandle(hThread2);

InitializeCriticalSection(&g_csA);

InitializeCriticalSection(&g_csB);

Sleep(4000);

DeleteCriticalSection(&g_csA);

DeleteCriticalSection(&g_csB);

}

DWORD WINAPI Fun1Proc(

LPVOID lpParameter // thread data

)

{

while(TRUE)

{

EnterCriticalSection(&g_csA);

Sleep(1);

EnterCriticalSection(&g_csB);

if(tickets>0)

{

Sleep(1);

cout<<"thread1 sell ticket : "<<tickets--<<endl;

}

else

break;

LeaveCriticalSection(&g_csB);

LeaveCriticalSection(&g_csA);

}

return 0;

}

DWORD WINAPI Fun2Proc(

LPVOID lpParameter // thread data

)

{

while(TRUE)

{

EnterCriticalSection(&g_csB);

Sleep(1);

EnterCriticalSection(&g_csA);

if(tickets>0)

{

Sleep(1);

cout<<"thread2 sell ticket : "<<tickets--<<endl;

}

else

break;

LeaveCriticalSection(&g_csA);

LeaveCriticalSection(&g_csB);

}

cout<<"thread2 is running!"<<endl;

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  thread syn asyn soc