?? sy0602.htm
字號:
<html>
<HEAD>
<TITLE>Visual C++與計算機接口</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=gb2312" >
</HEAD>
<body>
<font color="#0000FF">多線程的使用</font>
<p>
(一)實驗目的:<BR>
學習多線程的使用<BR><BR>
(二)線程<BR><BR>
在Win32中,每個運行的程序就是一個進程,而每個進程可以由一個或多個線程組成。<BR>
進程的所有線程共享進程的代碼、資源、內存和全局變量。<BR>
進程是從單一線程開始啟動的,其他線程是根據需要被動態創建的。<BR>
一個線程其實就是一條獨立的執行程序代碼的路徑。如果一個進程創建了多個線程,就有多條路徑執行代碼,而且代碼在相應路徑上是并行執行的(分時處理)。<BR><BR>
在Win32中,線程為擁有CPU時間的最小實體,CPU會為所有進程的每個活動線程分配一份處理時間,甚至可以依據線程的優先級分配不均等的時間片。<BR>
由于CPU把時間片分得很小——大約20毫秒左右,因此,多線程會令人認為似乎當前的所有活動線程都在同時工作。<BR><BR>
1、使用線程的益處:<BR>
·多線程使得進程能夠同時執行多個任務。例如應用程序可以使用一個線程來處理鼠標鍵盤等的用戶輸入,而使用其他較低優先級的線程來進行計算或后臺打印等。<BR>
·多線程在MDI應用程序中也很有用處。當打開多個窗口時,不同的線程可以分別指派給各個窗口,用于處理個窗口的事務。<BR>
·多線程在網絡和通信方面有很大用處。例如一個網絡服務程序可以為連接來的每個客戶創建一個線程。線程亦可幫助應用程序處理來自多個通信設備的輸入。<BR><BR>
2、何時使用線程:<BR>
·有效的分攤任務。<BR>
·對不同的任務賦予不同的優先級。<BR>
·后臺處理。<BR>
·分攤并行任務的執行。<BR><BR>
3、創建線程:<BR>
在MFC中,創建線程通常使用AfxBeginThread()函數:<BR>
CWinThread* AfxBeginThread(lpThreadFunc, pParam);<BR>
或 CWinThread* AfxBeginThread(lpThreadFunc, pParam, nPriority);<BR>
其中lpThreadFunc:線程函數。<BR>
pParam:傳遞給線程函數的實參,可以是任意32位數據。<BR>
nPriority:線程優先級。缺省為THREAD_PRIORITY_NORMAL。<BR><BR>
線程函數是線程的執行路徑,該函數的執行和退出也就是線程的啟動和終止,函數的執行過程也就是線程的執行過程。<BR>
線程函數原型為:UINT ThreadFunc(LPVOID pParam);<BR>
線程函數必須為一個全局函數,其唯一參數由AfxBeginThread()傳遞傳遞,傳遞的實參根據線程的需要而定。<BR><BR>
AfxBeginThread()的返回值是一個CWinThread對象的指針。取得該返回值并不十分必要,但若需要訪問該線程,例如獲取線程信息、終止線程、設置優先級等,就應該接受這一返回值。<BR><BR>
(三)實驗步驟:<BR><BR>
1、建立一個MFC應用程序。<BR><BR>
2、下載<a href="anim.h">anim.h</a>和<a href="anim.cpp">anim.cpp</a>,并加入到新建的Project中。<BR>
這兩個文件用于管理圖形和動畫,主要工作是先利用MemDC將圖形準備好,再在需要的時候BitBlt到DC中。<BR><BR>
3、在View類的頭文件中添加:<BR>
#include "anim.h"<BR>
UINT ThreadFunc(LPVOID pParam);<BR><BR>
4、在View類中添加成員變量和成員函數:<BR>
class MAnimation *m_pAnimation;<BR>
void Animate();<BR><BR>
5、在View類中加入WM_CREATE消息映射函數OnCreate(),并加入代碼:<BR>
m_pAnimation = new MAnimation(m_hWnd);<BR>
AfxBeginThread(ThreadFunc,this);<BR><BR>
6、在View類的cpp文件中手工加入函數Animate():<BR>
void CTttView::Animate()<BR>
{<BR>
RECT rcClient;<BR>
GetClientRect(&rcClient);<BR>
m_pAnimation->AnimateShape(rcClient);<BR>
}<BR><BR>
7、在View類中加入WM_SIZE消息映射函數OnSize(),并加入代碼:<BR>
m_pAnimation->SetSize(m_hWnd, nType, cx, cy);<BR>
Invalidate();<BR><BR>
8、在View類的cpp文件中加入線程函數:<BR>
UINT ThreadFunc(LPVOID pParam)<BR>
{<BR>
while (TRUE)<BR>
{<BR>
((CTttView *)pParam)->Animate();<BR>
Sleep(10);<BR>
}<BR>
return true;<BR>
}<BR><BR>
9、編譯運行,查看結果。<BR><BR>
以上步驟即為:<BR>
·在View類中定義一個MAnimation指針<BR>
·在OnCreate函數中創建MAnimation對象,并開啟線程<BR>
·在OnSize函數中調用MAnimation的函數改變圖形的大小<BR>
·還可以定義函數并調用MAnimation的函數改變圖形的顏色、速度等<BR>
·線程不停的調用MAnimation的函數繪制圖形<BR>
·線程中使用Sleep以控制繪制圖形的速度<BR><BR>
運行此程序,可以看到當關閉主窗口時沒有問題,但若只關閉一個子窗口,將會出現錯誤。<BR>
這是因為線程不是依附于窗口的,子窗口雖然關閉了,但線程卻不會主動關閉。<BR>
線程可以強制關閉,只需調用AfxEndThread()函數。但這可能會引起內存泄露等多種問題。<BR>
一般情況下,線程總應該由自身直接終止。其他線程可以通過一個同步信號或共享變量,通知被終止的線程。被終止的線程接到通知后,即可正常退出。<BR><BR>
<a href="l0602.exe">執行文件示例</a>
<p></p>
</body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -