- 相關(guān)推薦
基于VC++的多線(xiàn)程通信程序設計論文
介紹了Windows多線(xiàn)程技術(shù)、多線(xiàn)程間通信、以及多線(xiàn)程通信程序設計的主要函數,然后在前面關(guān)鍵技術(shù)的基礎上,采用VC++ 6.0 為開(kāi)發(fā)平臺, 實(shí)現了一個(gè)基于VC++的多線(xiàn)程局域網(wǎng)聊天程序。
在多任務(wù)Windows編程中,為了提高代碼的時(shí)、空效率,廣泛采取后臺程序和前臺程序,而前臺任務(wù)及后臺任務(wù)是通過(guò)多線(xiàn)程技術(shù)來(lái)實(shí)現,從而線(xiàn)程間的通信就變得極為重要。Visual C++對Windwos線(xiàn)程和消息的多任務(wù)機制提供了強有力的支持,并封裝了大量的通信函數,給多線(xiàn)程通信程序編程帶來(lái)了很大的便利。
1、多線(xiàn)程技術(shù)概述
多線(xiàn)程在Windows編程中是一個(gè)比較重要的概念。所謂多線(xiàn)程,即在同一個(gè)程序中可以同時(shí)執行多個(gè)任務(wù)。這意味著(zhù),編程者可以將整個(gè)任務(wù)分成幾個(gè)線(xiàn)程,然后讓操作系統同時(shí)執行,從而提高程序的執行效率。一般線(xiàn)程被分為兩種:用戶(hù)界面線(xiàn)程和工作線(xiàn)程(又稱(chēng)為后臺線(xiàn)程)。
1.1 創(chuàng )建線(xiàn)程與終止線(xiàn)程
創(chuàng )建線(xiàn)程的過(guò)程可以分成兩大步驟,首先編寫(xiě)線(xiàn)程函數,然后創(chuàng )建線(xiàn)程,并將其參數線(xiàn)程函數地址指向剛剛編寫(xiě)的線(xiàn)程函數。線(xiàn)程函數的退出,除了使用退出函數處理外,大都是隨著(zhù)程序的結束而退出。
1.2 線(xiàn)程同步
多線(xiàn)程提高了程序執行的效率,提高了編程的靈活性,但同時(shí)也引入了新的問(wèn)題。線(xiàn)程之間經(jīng)常要同時(shí)訪(fǎng)問(wèn)一些資源,因此對共享資源進(jìn)行訪(fǎng)問(wèn)引起沖突是不可避免的。另外,在Windwos的消息驅動(dòng)方式下,必須某個(gè)事件的發(fā)生了,才可以執行某個(gè)線(xiàn)程,為了解決上述問(wèn)題,必須引入線(xiàn)程同步的概念。Win32 API提供了多種同步控制對象,包括臨界區、互斥對象、信號量和事件。
2、多線(xiàn)程間通信
一般而言,應用程序中的一個(gè)次要線(xiàn)程總是為主線(xiàn)程執行特定的任務(wù),這樣,主線(xiàn)程和次要線(xiàn)程間必定有一個(gè)信息傳遞的渠道,也就是主線(xiàn)程和次要線(xiàn)程間要進(jìn)行通信。這種線(xiàn)程間的通信不但是難以避免的,而且在多線(xiàn)程編程中也是復雜和頻繁的。多線(xiàn)程間通信可以采用全局變量、自定義消息、事件對象通信。
1) 使用全局變量進(jìn)行通信
由于屬于同一個(gè)進(jìn)程的各個(gè)線(xiàn)程共享操作系統分配該進(jìn)程的資源,故解決線(xiàn)程間通信最簡(jiǎn)單的一種方法是使用全局變量。對于標準類(lèi)型的全局變量,可以使用volatile修飾符,它告訴編譯器無(wú)需對該變量作任何的優(yōu)化,即無(wú)需將它放到一個(gè)寄存器中,并且該值可被外部改變。如果線(xiàn)程間所需傳遞的信息較復雜,可以定義一個(gè)結構,通過(guò)傳遞指向該結構的指針進(jìn)行傳遞信息。
2) 使用自定義消息進(jìn)行通信
可以在一個(gè)線(xiàn)程的執行函數中向另一個(gè)線(xiàn)程發(fā)送自定義的消息來(lái)達到通信的目的。一個(gè)線(xiàn)程向另外一個(gè)線(xiàn)程發(fā)送消息是通過(guò)操作系統實(shí)現的。利用Windows操作系統的消息驅動(dòng)機制,當一個(gè)線(xiàn)程發(fā)出一條消息時(shí),操作系統首先接收到該消息,然后把該消息轉發(fā)給目標線(xiàn)程,接收消息的線(xiàn)程必須已經(jīng)建立了消息循環(huán)。
3) 使用事件對象進(jìn)行通信
在線(xiàn)程之間傳送信號的一種比較復雜的方法是使用享件對象,在MFC中有一個(gè)事件類(lèi)CEvent。一個(gè)事件對象可以處于兩種狀態(tài)的一種:信號態(tài)和非信號態(tài)。線(xiàn)程能夠監視處于信號態(tài)的事件,以便在適當的時(shí)間執行對事件的操作。
3、多線(xiàn)程通信程序設計
3.1 重要函數
1) Win32 API對多線(xiàn)程編程的支持
Win32提供了一系列的API函數來(lái)完成線(xiàn)程的創(chuàng )建、掛起、恢復、終結以及通信等工作。下面將選取其中的一些重要函數進(jìn)行說(shuō)明。
、貶ANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,DWORD dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId);
該函數在其調用進(jìn)程的進(jìn)程空間里創(chuàng )建一個(gè)新的線(xiàn)程,并返回已建線(xiàn)程的句柄,如果創(chuàng )建成功則返回線(xiàn)程的句柄,否則返回NULL。
、贒WORD SuspendThread(HANDLE hThread);
該函數用于掛起指定的線(xiàn)程,如果函數執行成功,則線(xiàn)程的執行被終止。
、跠WORD ResumeThread(HANDLE hThread);
該函數用于結束線(xiàn)程的掛起狀態(tài),執行線(xiàn)程。
、躒OID ExitThread(DWORD dwExitCode);
該函數用于線(xiàn)程終結自身的執行,主要在線(xiàn)程的執行函數中被調用。其中參數dwExitCode用來(lái)設置線(xiàn)程的退出碼。
、軧OOL TerminateThread(HANDLE hThread,DWORD dwExitCode);
一般情況下,線(xiàn)程運行結束之后,線(xiàn)程函數正常返回,但是應用程序可以調用TerminateThread強行終止某一線(xiàn)程的執行。使用TerminateThread()終止某個(gè)線(xiàn)程的執行是不安全的,可能會(huì )引起系統不穩定;雖然該函數立即終止線(xiàn)程的執行,但并不釋放線(xiàn)程所占用的資源。因此,一般不建議使用該函數。
、轇OOL PostThreadMessage(DWORD idThread,UINT Msg,WPARAM wParam,LPARAM lParam);
該函數將一條消息放入到指定線(xiàn)程的消息隊列中,并且不等到消息被該線(xiàn)程處理時(shí)便返回。調用該函數時(shí),如果即將接收消息的線(xiàn)程沒(méi)有創(chuàng )建消息循環(huán),則該函數執行失敗。
2) MFC對多線(xiàn)程編程的支持
MFC中有兩類(lèi)線(xiàn)程,分別稱(chēng)之為工作者線(xiàn)程和用戶(hù)界面線(xiàn)程。二者的主要區別在于工作者線(xiàn)程沒(méi)有消息循環(huán),而用戶(hù)界面線(xiàn)程有自己的消息隊列和消息循環(huán)。
工作者線(xiàn)程沒(méi)有消息機制,通常用來(lái)執行后臺計算和維護任務(wù),如冗長(cháng)的計算過(guò)程,打印機的后臺打印等。用戶(hù)界面線(xiàn)程一般用于處理獨立于其他線(xiàn)程執行之外的用戶(hù)輸入,響應用戶(hù)及系統所產(chǎn)生的事件和消息等。但對于Win32的API編程而言,這兩種線(xiàn)程是沒(méi)有區別的,它們都只需線(xiàn)程的啟動(dòng)地址即可啟動(dòng)線(xiàn)程來(lái)執行任務(wù)。
在MFC中,一般用全局函數AfxBeginThread()來(lái)創(chuàng )建并初始化一個(gè)線(xiàn)程的運行,該函數有兩種重載形式,分別用于創(chuàng )建工作者線(xiàn)程和用戶(hù)界面線(xiàn)程。兩種重載函數原型和參數分別說(shuō)明如下:
、貱WinThread* AfxBeginThread(AFX_THREADPROC pfnThreadProc,LPVOID pParam,
nPriority=THREAD_PRIORITY_NORMAL, UINT nStackSize=0,
DWORD dwCreateFlags=0,LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL);
、贑WinThread* AfxBeginThread(CRuntimeClass* pThreadClass,
int nPriority=THREAD_PRIORITY_NORMAL,UINT nStackSize=0,
DWORD dwCreateFlags=0, LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL);
一般情況下,調用AfxBeginThread()來(lái)一次性地創(chuàng )建并啟動(dòng)一個(gè)線(xiàn)程,但是也可以通過(guò)兩步法來(lái)創(chuàng )建線(xiàn)程:首先創(chuàng )建CWinThread類(lèi)的一個(gè)對象,然后調用該對象的成員函數CreateThread()來(lái)啟動(dòng)該線(xiàn)程。
、踲irtual BOOL CWinThread::InitInstance();
重載該函數以控制用戶(hù)界面線(xiàn)程實(shí)例的初始化。初始化成功則返回非0值,否則返回0。用戶(hù)界面線(xiàn)程經(jīng)常重載該函數,工作者線(xiàn)程一般不使用InitInstance()。
、躹irtual int CWinThread::ExitInstance();
在線(xiàn)程終結前重載該函數進(jìn)行一些必要的清理工作。該函數返回線(xiàn)程的退出碼,0表示執行成功,非0值用來(lái)標識各種錯誤。同InitInstance()成員函數一樣,該函數也只適用于用戶(hù)界面線(xiàn)程。
3.2 VC++下多線(xiàn)程局域網(wǎng)聊天程序
聊天程序是現代生活中不可缺少的通信工具,為了在局域網(wǎng)中實(shí)現點(diǎn)對點(diǎn)的實(shí)時(shí)通信,在VC++的編程環(huán)境中,利用套接字庫技術(shù)和多線(xiàn)程編程技術(shù)實(shí)現聊天程序。
1) 界面設計。界面設計如圖1所示。
2) 函數
void CMyQQDlg:: SendMsg() //發(fā)送消息
void CMyQQDlg:: SendFile() //發(fā)送文件
void CMyQQDlg:: Caputer() //抓取屏幕
void CMyQQDlg::AddMsgList(CString IP,CString str) //添加信息于LISTBOX 控件中
CString CMyQQDlg::GetError(DWORD error) //返回錯誤信息
int CMyQQDlg::GetLocalHostName(CString &sHostName) //獲得本地計算機名稱(chēng)
int CMyQQDlg::GetIpAddress(const CString &sHostName, CString &sIpAddress)//獲得本地IP
int CMyQQDlg::GetNamebyAddress(const CString &IpAddress,CString &sYouName)//獲得對方計算機名稱(chēng)
3) 線(xiàn)程啟動(dòng)
pThreadLisen=::AfxBeginThread(_ListenTcpThread,this); //開(kāi)始TCP線(xiàn)程
pThreadLisen=::AfxBeginThread(_UDPThread,this); //開(kāi)始UDP線(xiàn)程
4) 服務(wù)器線(xiàn)程
UINT _ListenTcpThread(LPVOID lparam) //TCP監聽(tīng)線(xiàn)程
UINT _UDPThread(LPVOID lparam) //UDP接受信息線(xiàn)程開(kāi)始
5) 客戶(hù)端線(xiàn)程
UINT _SendFileThread(LPVOID lparam) //發(fā)送文件線(xiàn)程
UINT _SendMsgThread(LPVOID lparam) //TCP發(fā)送信息線(xiàn)程
UINT _SendMsgUdpThread(LPVOID lparam) //UDP發(fā)送信息
UINT _ThreadCapture(LPVOID lparam) //抓取對方屏幕線(xiàn)程
以上程序在Windows XP, Microsoft Visual C++6.0中編譯執行通過(guò)。
4、結束語(yǔ)
要設計出性能較好的多線(xiàn)程通信程序,不僅需要對操作系統的處理過(guò)程很清楚,還需要對VC++的線(xiàn)程處理函數十分了解,并對具體應用中各線(xiàn)程的關(guān)系非常清楚,以利于在應用程序中控制同步事件的發(fā)生,避免出現死鎖或不能同步處理的現象。
【基于VC++的多線(xiàn)程通信程序設計論文】相關(guān)文章:
基于 DSP 的網(wǎng)絡(luò )通信程序設計07-19
基于VC++串行通信的無(wú)刷直流電機監控系統07-26
基于A(yíng)MF的Android數據通信論文10-29
基于Vxworks實(shí)時(shí)操作系統的串口通信程序設計與實(shí)現06-18
基于分層思想的基本通信系統CPN建模論文09-11
淺談基于單片機的數據串口通信研究論文08-27