999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于VC++的多線程通信程序設計

2008-12-31 00:00:00楊紅軍王金英
電腦知識與技術 2008年29期

摘要:介紹了Windows多線程技術、多線程間通信、以及多線程通信程序設計的主要函數,然后在前面關鍵技術的基礎上,采用VC++ 6.0 為開發平臺, 實現了一個基于VC++的多線程局域網聊天程序。

關鍵詞:多線程技術;Viusal C++;通信

中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2008)29-0413-03

On System Design of the Multi-threaded Communication Based on VC++

YANG Hong-jun, WANG Jin-ying

(Qinhuangdao Vocational and Technical College,Qinhuangdao 066004,China)

Abstract: This thesis discussed on System design of the multi-threaded Communication Based on VC++,firstly, it introduced the multi-threaded technology in Windows,secondly,it analyzed the Communication between multi-threaded,Thirdly, it elaborated the main function of multi-threaded Communication based on VC++. in the last, the chatting programming under VC ++ environment is described after the analysis of the key technology.

Key words: multi-threaded technology; Viusal C++; communication

在多任務Windows編程中,為了提高代碼的時、空效率,廣泛采取后臺程序和前臺程序,而前臺任務及后臺任務是通過多線程技術來實現,從而線程間的通信就變得極為重要。Visual C++對Windwos線程和消息的多任務機制提供了強有力的支持,并封裝了大量的通信函數,給多線程通信程序編程帶來了很大的便利。

1 多線程技術概述

多線程在Windows編程中是一個比較重要的概念。所謂多線程,即在同一個程序中可以同時執行多個任務。這意味著,編程者可以將整個任務分成幾個線程,然后讓操作系統同時執行,從而提高程序的執行效率。一般線程被分為兩種:用戶界面線程和工作線程(又稱為后臺線程)。

1.1 創建線程與終止線程

創建線程的過程可以分成兩大步驟,首先編寫線程函數,然后創建線程,并將其參數線程函數地址指向剛剛編寫的線程函數。線程函數的退出,除了使用退出函數處理外,大都是隨著程序的結束而退出。

1.2 線程同步

多線程提高了程序執行的效率,提高了編程的靈活性,但同時也引入了新的問題。線程之間經常要同時訪問一些資源,因此對共享資源進行訪問引起沖突是不可避免的。另外,在Windwos的消息驅動方式下,必須某個事件的發生了,才可以執行某個線程,為了解決上述問題,必須引入線程同步的概念。Win32 API提供了多種同步控制對象,包括臨界區、互斥對象、信號量和事件。

2 多線程間通信

一般而言,應用程序中的一個次要線程總是為主線程執行特定的任務,這樣,主線程和次要線程間必定有一個信息傳遞的渠道,也就是主線程和次要線程間要進行通信。這種線程間的通信不但是難以避免的,而且在多線程編程中也是復雜和頻繁的。多線程間通信可以采用全局變量、自定義消息、事件對象通信。

1) 使用全局變量進行通信

由于屬于同一個進程的各個線程共享操作系統分配該進程的資源,故解決線程間通信最簡單的一種方法是使用全局變量。對于標準類型的全局變量,可以使用volatile修飾符,它告訴編譯器無需對該變量作任何的優化,即無需將它放到一個寄存器中,并且該值可被外部改變。如果線程間所需傳遞的信息較復雜,可以定義一個結構,通過傳遞指向該結構的指針進行傳遞信息。

2) 使用自定義消息進行通信

可以在一個線程的執行函數中向另一個線程發送自定義的消息來達到通信的目的。一個線程向另外一個線程發送消息是通過操作系統實現的。利用Windows操作系統的消息驅動機制,當一個線程發出一條消息時,操作系統首先接收到該消息,然后把該消息轉發給目標線程,接收消息的線程必須已經建立了消息循環。

3) 使用事件對象進行通信

在線程之間傳送信號的一種比較復雜的方法是使用享件對象,在MFC中有一個事件類CEvent。一個事件對象可以處于兩種狀態的一種:信號態和非信號態。線程能夠監視處于信號態的事件,以便在適當的時間執行對事件的操作。

3 多線程通信程序設計

3.1 重要函數

1) Win32 API對多線程編程的支持

Win32提供了一系列的API函數來完成線程的創建、掛起、恢復、終結以及通信等工作。下面將選取其中的一些重要函數進行說明。

①HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,DWORD dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId);

該函數在其調用進程的進程空間里創建一個新的線程,并返回已建線程的句柄,如果創建成功則返回線程的句柄,否則返回NULL。

②DWORD SuspendThread(HANDLE hThread);

該函數用于掛起指定的線程,如果函數執行成功,則線程的執行被終止。

③DWORD ResumeThread(HANDLE hThread);

該函數用于結束線程的掛起狀態,執行線程。

④VOID ExitThread(DWORD dwExitCode);

該函數用于線程終結自身的執行,主要在線程的執行函數中被調用。其中參數dwExitCode用來設置線程的退出碼。

⑤BOOL TerminateThread(HANDLE hThread,DWORD dwExitCode);

一般情況下,線程運行結束之后,線程函數正常返回,但是應用程序可以調用TerminateThread強行終止某一線程的執行。使用TerminateThread()終止某個線程的執行是不安全的,可能會引起系統不穩定;雖然該函數立即終止線程的執行,但并不釋放線程所占用的資源。因此,一般不建議使用該函數。

⑥BOOL PostThreadMessage(DWORD idThread,UINT Msg,WPARAM wParam,LPARAM lParam);

該函數將一條消息放入到指定線程的消息隊列中,并且不等到消息被該線程處理時便返回。調用該函數時,如果即將接收消息的線程沒有創建消息循環,則該函數執行失敗。

2) MFC對多線程編程的支持

MFC中有兩類線程,分別稱之為工作者線程和用戶界面線程。二者的主要區別在于工作者線程沒有消息循環,而用戶界面線程有自己的消息隊列和消息循環。

工作者線程沒有消息機制,通常用來執行后臺計算和維護任務,如冗長的計算過程,打印機的后臺打印等。用戶界面線程一般用于處理獨立于其他線程執行之外的用戶輸入,響應用戶及系統所產生的事件和消息等。但對于Win32的API編程而言,這兩種線程是沒有區別的,它們都只需線程的啟動地址即可啟動線程來執行任務。

在MFC中,一般用全局函數AfxBeginThread()來創建并初始化一個線程的運行,該函數有兩種重載形式,分別用于創建工作者線程和用戶界面線程。兩種重載函數原型和參數分別說明如下:

①CWinThread* AfxBeginThread(AFX_THREADPROC pfnThreadProc,LPVOID pParam,

nPriority=THREAD_PRIORITY_NORMAL, UINT nStackSize=0,

DWORD dwCreateFlags=0,LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL);

②CWinThread* AfxBeginThread(CRuntimeClass* pThreadClass,

int nPriority=THREAD_PRIORITY_NORMAL,UINT nStackSize=0,

DWORD dwCreateFlags=0, LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL);

一般情況下,調用AfxBeginThread()來一次性地創建并啟動一個線程,但是也可以通過兩步法來創建線程:首先創建CWinThread類的一個對象,然后調用該對象的成員函數CreateThread()來啟動該線程。

③virtual BOOL CWinThread::InitInstance();

重載該函數以控制用戶界面線程實例的初始化。初始化成功則返回非0值,否則返回0。用戶界面線程經常重載該函數,工作者線程一般不使用InitInstance()。

④virtual int CWinThread::ExitInstance();

在線程終結前重載該函數進行一些必要的清理工作。該函數返回線程的退出碼,0表示執行成功,非0值用來標識各種錯誤。同InitInstance()成員函數一樣,該函數也只適用于用戶界面線程。

3.2 VC++下多線程局域網聊天程序

聊天程序是現代生活中不可缺少的通信工具,為了在局域網中實現點對點的實時通信,在VC++的編程環境中,利用套接字庫技術和多線程編程技術實現聊天程序。

1) 界面設計。界面設計如圖1所示。

2) 函數

void CMyQQDlg:: SendMsg() //發送消息

void CMyQQDlg:: SendFile() //發送文件

void CMyQQDlg:: Caputer() //抓取屏幕

void CMyQQDlg::AddMsgList(CString IP,CString str) //添加信息于LISTBOX 控件中

CString CMyQQDlg::GetError(DWORD error)//返回錯誤信息

int CMyQQDlg::GetLocalHostName(CString sHostName)//獲得本地計算機名稱

int CMyQQDlg::GetIpAddress(const CString sHostName, CString sIpAddress)//獲得本地IP

int CMyQQDlg::GetNamebyAddress(const CString IpAddress,CString sYouName)//獲得對方計算機名稱

3) 線程啟動

pThreadLisen=::AfxBeginThread(_ListenTcpThread,this);//開始TCP線程

pThreadLisen=::AfxBeginThread(_UDPThread,this);//開始UDP線程

4) 服務器線程

UINT _ListenTcpThread(LPVOID lparam) //TCP監聽線程

UINT _UDPThread(LPVOID lparam)//UDP接受信息線程開始

5) 客戶端線程

UINT _SendFileThread(LPVOID lparam) //發送文件線程

UINT _SendMsgThread(LPVOID lparam)//TCP發送信息線程

UINT _SendMsgUdpThread(LPVOID lparam)//UDP發送信息

UINT _ThreadCapture(LPVOID lparam)//抓取對方屏幕線程

以上程序在Windows XP, Microsoft Visual C++6.0中編譯執行通過。

4 結束語

要設計出性能較好的多線程通信程序,不僅需要對操作系統的處理過程很清楚,還需要對VC++的線程處理函數十分了解,并對具體應用中各線程的關系非常清楚,以利于在應用程序中控制同步事件的發生,避免出現死鎖或不能同步處理的現象。

參考文獻:

[1] 孫鑫,余安萍.VC++深入詳解(附光盤)[M].北京:電子工業出版社,2006.

[2] 孔鵬.Visual C++ 6.0完全自學手冊(附光盤)[M].北京:機械工業出版社,2007.

[3] 趙仕建.VISUAL C++ 6.0編程與實例解析[M].北京:科學出版社,2000.

[4] 胡曉軍,鄧波,高宏偉.Visual C++高級開發范例解析(含光盤)[M].北京:電子工業出版社,2002.

主站蜘蛛池模板: 精品无码一区二区三区在线视频| 国产三级精品三级在线观看| 91亚洲精选| 亚洲狼网站狼狼鲁亚洲下载| 无码AV动漫| 午夜性刺激在线观看免费| 欧美综合在线观看| 日韩欧美国产三级| 色妺妺在线视频喷水| AV网站中文| 色婷婷电影网| 成人毛片免费在线观看| 九九精品在线观看| 免费99精品国产自在现线| 国产成人艳妇AA视频在线| 国产办公室秘书无码精品| 国产手机在线ΑⅤ片无码观看| 国产丝袜丝视频在线观看| 国产在线专区| 全免费a级毛片免费看不卡| 亚洲精品天堂在线观看| 狠狠五月天中文字幕| a色毛片免费视频| 亚洲精品第一在线观看视频| 国产凹凸一区在线观看视频| 99久视频| 中文字幕调教一区二区视频| 国产精品浪潮Av| 综合网久久| 伊人激情综合| 91无码人妻精品一区| 日韩美毛片| 男女猛烈无遮挡午夜视频| 日韩AV无码免费一二三区| 丰满人妻中出白浆| 国产va在线观看免费| 国产一区二区三区在线观看视频 | 亚洲精品国产自在现线最新| 成人小视频网| 5388国产亚洲欧美在线观看| 国产成人久视频免费| 亚洲精品自在线拍| 亚洲国产在一区二区三区| 成人午夜视频在线| 久久综合五月| 98精品全国免费观看视频| 极品私人尤物在线精品首页 | 国产www网站| 欧洲欧美人成免费全部视频| 日韩精品成人网页视频在线| 亚洲区第一页| 女同国产精品一区二区| 日本高清免费一本在线观看| 嫩草在线视频| 青青青草国产| 成人看片欧美一区二区| 国产成人免费观看在线视频| 日本人妻一区二区三区不卡影院| 亚洲天堂网站在线| 国产成人精品一区二区| 欧洲熟妇精品视频| 国产精品99一区不卡| 亚洲视频一区| 欧美综合中文字幕久久| 一本大道东京热无码av| 欧美国产日韩在线观看| 国产91在线|日本| 在线观看无码av五月花| 她的性爱视频| 夜夜高潮夜夜爽国产伦精品| 欧美高清日韩| 免费在线国产一区二区三区精品| 91久久夜色精品国产网站 | 毛片卡一卡二| 18禁色诱爆乳网站| 毛片一区二区在线看| 中文字幕乱码二三区免费| 91九色视频网| 欧美亚洲网| 国产综合日韩另类一区二区| 91九色视频网| 日韩欧美视频第一区在线观看 |