孫鑫 第十五講 多執行緒聊天室程式建立

2021-06-02 14:36:44 字數 2605 閱讀 2781

孫鑫15課:多執行緒與聊天室程式的建立

程式,程序(32位程序,分配2的32次方,4gb,2gb核心分割槽,2gb使用者分割槽。),執行緒

程序是執行緒容器。真正完成**執行的是執行緒。主線程:main(),winmain()

下面建立乙個多執行緒的程式:(win32控制台程式 )

#include //訪問windows api函式

#include //c++標準輸入輸出流標頭檔案

int index=0;

int tickets=100;

handle hmutex;

dword winapi threadproc1(lpvoid lpparameter)

else

break;

releasemutex(hmutex);

}return 0;

} dword winapi threadproc2(lpvoid lpparameter)

else

break;

releasemutex(hmutex); }

return 0;

}void main()

//主線程退出,程序退出。則在此程序中包含的執行緒全部退出。

互斥物件(mutex)屬於核心物件,它能夠確保執行緒擁有對單個資源的互斥訪問權。

互斥物件包含乙個使用數量,乙個執行緒id和乙個計數器。

id用於標識系統中的哪個執行緒當前擁有互斥物件,計數器用於指明該執行緒擁有互斥物件的次數。

判斷先前是否有乙個應用例項在執行的**:(要//建立乙個命名的互斥物件)

hmutex=createmutex(null,true,"tickets");

if(hmutex)

} 下面編寫乙個網路聊天室程式:

建立乙個基於對話方塊的程式。

if (afxsocketinit(  )==0)//afxsocketinit(  )載入套接字版本1.1.//

在stdafx.h中加上#include 。

給cchatdlg加上

private:

socket m_socket;

並在cchatdlg的建構函式中將m_socket=0

和乙個成員函式:bool cchatdlg::initsock()

bool cchatdlg::initsock()

sockaddr_in addrsk;

addrsk.sin_addr.s_un.s_addr=htonl(inaddr_any);

addrsk.sin_family=af_inet;

addrsk.sin_port=htons(6000);

if(socket_error==bind(m_socket,(sockaddr*)&addrsk,sizeof(sockaddr_in)))

return true; }

在bool cchatdlg::oninitdialog()中加下面**:

if(false==initsock())

recvfrom如果沒有資料過來,它會阻塞程序執行。因此把接收資料操作放到乙個單獨的執行緒中完成。

給chatdlg.h 增加乙個成員結構體的變數:

struct recvparam ;

在bool cchatdlg::oninitdialog()中增加下面**:

recvparam *recvparam=new recvparam;

recvparam->sock=m_socket;

recvparam->hwnd=m_hwnd;

handle handle=createthread(null,0,recvproc,(lpvoid)recvparam,0,null);

closehandle(handle);

在這本例中把接收函式寫成是cchatdlg的成員函式

在class cchatdlg : public cdialog中加

static  dword winapi recvproc(lpvoid lpparameter);//static的話,這個函式不屬於哪個成員變數,它只屬於這個類本身。所以在其它函式中可以直接呼叫這個函式。

dword winapi cchatdlg::recvproc(lpvoid lpparameter)

}

return 0; }

在chatdlg.h中

#define  wm_recvdata wm_user+1

在class cchatdlg : public cdialog中加入:

afx_msg void onrecvdata(wparam wparam,lparam lparam);

在begin_message_map(cchatdlg, cdialog)

//}afx_msg_map

end_message_map()

end_message_map()中加入上面紅色的一句

void cchatdlg::onrecvdata(wparam wparam,lparam lparam)

傳送按鈕的**如下:

//記得讓接收文字框的屬性加一 個多行

void cchatdlg::onbtnsend()

孫鑫MFC深入詳解 第十五章 多執行緒(一)

windows中的多執行緒程式設計一直是所有程式設計人員感到困難的乙個地方,主要是在windows多執行緒程式設計中,往往要考慮很多的東西,執行緒啟用的多少,執行緒之間的同步問題等等.下面通過模擬火車售票系統來進行講解 include include using namespace std dwor...

孫鑫MFC深入詳解 第十五章 多執行緒(三)

對命名互斥物件進行例項講解,如下 multithread5.cpp include include using namespace std dword winapi threadproc1 lpvoid lpparameter dword winapi threadproc2 lpvoid lppa...

第十五講 動畫製作

到目前為止我們所做的圖形全部都是靜止的。而opengl的是乙個可以製作大型3d圖形 動畫的工具。下面我們做乙個可以旋轉的立方體。例16 乙個旋轉的立方體 include glfloat x 10.0f glfloat y 1.0f glfloat z 5.0f void mydisplay void...