導航:首頁 > 編程語言 > window多線程編程

window多線程編程

發布時間:2022-09-18 19:14:57

『壹』 多線程編程里的thread.sleep問題

thread.sleep(0) 或3,只是讓CPU能切換下時間片,有機會騰出CPU讓別人執行。
window的計時最小是以15ms做為單位的,以15ms遞增的,所以可以有15,30,45,15倍數的精度,而且是在上下浮動,設為30可能是15,可能是45(主要看cpu忙不忙)。

『貳』 windows環境,多線程情況下,C語言向文件寫入數據。

①、對於你能寫這么長的問題描述,說明你很認真。

②、你的目的性較強,但是你也想有更加明確的目標,我可以給你講一下怎麼自己去尋找目標和路線以及怎樣學習。

③、計算機專業領域一共有幾個大方向,十幾個分支方向,而每個分支方向又有幾十個小方向,每一個方向的深入學習與熟練到一定火候都不是一朝一夕,互相之間也不是完全沒聯系的,但是你現在就應該選擇一個大方向並在其中的一個小方向內深入(為什麼要這么早就選擇具體的分支方向?後面說)。

④、這里列出計算機的幾個大方向(非編程開發類的我就不說了):
基本方向:
1、單片機、嵌入式方向
2、網路編程:涉及到伺服器程序、客戶端開發、腳本設計等。
3、系統編程:基礎API開發、桌面開發、系統程序開發、服務程序
4、圖形學:3D、2D、圖像識別、人臉識別
5、音頻:語音識別、音頻解碼、音頻軟體
6、編譯原理:編譯器設計、腳本解釋器、虛擬機、非自然語言翻譯系統
7、應用層開發:利用高層語言去開發表層應用
8、安全:反工程、病毒、反病毒、木馬、反木馬、軟體破解、軟體加殼
附加方向:
8、人工智慧:遺傳演算法、神經網路、灰色系統等等
9、游戲設計:各種游戲引擎設計以及業務邏輯設計等

⑤、基本方向是你一定要選的,附加方向只是基於基本方向的一些錦上添花,但是不管你怎麼選,最開始某些東西一定要深入而不是只是懂就夠(當然你對自己要求似乎不會很低),我把這個列出來:

數據結構:下面其他理論的基礎。
操作系統原理:理解操作系統的架構和細節,你才能對以後關於多線程、文件管理、內存管理、指令優先順序等有一個正確理解和運用。
編譯原理:能夠升華你對計算機編程語言的理解,對以後出現的各種編譯、解釋、兼容、移植、優化、並發與並行演算法等有一個深入理解。
資料庫系統原理:這個是進入公司都要會的,也是大型軟體開發的基礎。
軟體工程:這個是你能夠在經驗不足還能保證大項目正常完成的理論基礎。
網路技術:這個是必須學的,因為目前幾乎沒有一款裝幾率很高的軟體或者平台跟網路無關。

數學的話,主要是:離散數學、線性代數、高等數學、計算機圖形學、概率論

以上幾個基礎就是你成為一個融匯各個主要分支牛人必須學的(當然不是指理論,而是理論+實踐編碼能力)

⑥以上都是大的基礎,要一一攻破並深入學習,雖然網路時代計算機專業知識爆炸式的增長,但是以上幾個基礎掌握後,會發現,以後的什麼新的理論和技術都是基於這些大基礎,你就很容易理解了。

⑦我為什麼開頭不講你要具體學什麼怎麼順序學呢?因為那些技術你要掌握的話,根本可以自己解決,但是如果你由於興趣,沉迷於一些自己可見的小范圍技術的話,那麼畢業後雖然也能找到不錯的工作,薪水也可能高,但是不能成為一個大牛。

現在才開始講學習順序,雖然你說不要推薦書,不過我還是要用書來做順序。
C語言是可以寫很多核心和高級的東西,而不只是小東西,但是從你代碼來看,居然用到了 goto,我不是說你那些程序用到GOTO有什麼不好,而是一定要避免用GOTO,goto是錯誤之源,如果你有什麼內容非要用到goto才能寫到,說明你的編碼技巧還有不少提高空間。

你的學習順序應該是:
C:做一個超級馬里奧出來,並能夠讀取文本腳本來更新關卡。
C++:寫一個2D圖形引擎,封裝掉細節,實現面向對象設計和可復用設計,並且用到《設計模式》中提到的一些設計模式,這樣才能算對C++有一個很好的掌握。
MFC:MFC技術雖然近期已經冷下來了,但是你能熟練掌握它,才能證明你的C++OO技術夠純熟,嚴格證明你掌握了MFC很簡單,你只要用MFC做出一個殺毒引擎就差不多了。推薦的書有《深入淺出MFC》。
《Windows程序設計》:和MFC不同的是,用的是windows核心SDK,也就是API,這本書學完後,你才能從操作系統層面上算掌握了win32 平台下的機理(其實win64和win32大部分機理類似)。
C#:C#里集合了當代和前沿計算機科學里最先進的一些語法(雖然執行效率一直被人質疑),但是你學完C#並深入後,至少能夠算是對計算機語言有一個更加深刻的理解了。如何證明你C#學的不錯了?也很簡單,再次寫一個隨便什麼游戲,比如俄羅斯方塊。如果更加證明自己呢?用它寫一個P2P網路對戰游戲。

(如果你注意的話,會發現我說的學習順序都是沿著語言和某些技術的,為什麼呢?因為這些語言和技術涉及到特定的領域技術和計算機理論思想,比如學完了C#的話,就不單指學完了C#,而是把多種語言範式都學習了一遍,以及現代的程序開發思維(因為裡面用到了很多讓你一勞永逸的技術))

以上5個步驟都是基礎大步驟,要解決的話要沒1-2年應該不夠。
與此同時,要盡快選出文中你感興趣的方向作為3-5年的長期方向,不要擔心過早選擇分支方向會有什麼損失,因為計算機很多分支是相通的,只有你把分支方向深入進去,才能真正理解很多理論的實踐意義。並且一旦你在某個分支領域形成了較強的優勢(比如,到公司里只有你這方面最強),那麼你就是稀缺人才。

關於大方向的步驟就不說了,你主要就是要把我說的這幾個基礎步驟先解決,同時平時要注重大方向理論結合實際去編碼和開發。

『叄』 為什麼運行程序的時候不能幹別的

一、問題的提出
編寫一個耗時的單線程程序:
新建一個基於對話框的應用程序SingleThread,在主對話框IDD_SINGLETHREAD_DIALOG添加一個按鈕,ID為IDC_SLEEP_SIX_SECOND,標題為「延時6秒」,添加按鈕的響應函數,代碼如下:

void CSingleThreadDlg::OnSleepSixSecond()
{
Sleep(6000); //延時6秒
}

編譯並運行應用程序,單擊「延時6秒」按鈕,你就會發現在這6秒期間程序就象「死機」一樣,不在響應其它消息。為了更好地處理這種耗時的操作,我們有必要學習——多線程編程。

二、多線程概述
進程和線程都是操作系統的概念。進程是應用程序的執行實例,每個進程是由私有的虛擬地址空間、代碼、數據和其它各種系統資源組成,進程在運行過程中創建的資源隨著進程的終止而被銷毀,所使用的系統資源在進程終止時被釋放或關閉。
線程是進程內部的一個執行單元。系統創建好進程後,實際上就啟動執行了該進程的主執行線程,主執行線程以函數地址形式,比如說main或WinMain函數,將程序的啟動點提供給Windows系統。主執行線程終止了,進程也就隨之終止。
每一個進程至少有一個主執行線程,它無需由用戶去主動創建,是由系統自動創建的。用戶根據需要在應用程序中創建其它線程,多個線程並發地運行於同一個進程中。一個進程中的所有線程都在該進程的虛擬地址空間中,共同使用這些虛擬地址空間、全局變數和系統資源,所以線程間的通訊非常方便,多線程技術的應用也較為廣泛。
多線程可以實現並行處理,避免了某項任務長時間佔用CPU時間。要說明的一點是,目前大多數的計算機都是單處理器(CPU)的,為了運行所有這些線程,操作系統為每個獨立線程安排一些CPU時間,操作系統以輪換方式向線程提供時間片,這就給人一種假象,好象這些線程都在同時運行。由此可見,如果兩個非常活躍的線程為了搶奪對CPU的控制權,在線程切換時會消耗很多的CPU資源,反而會降低系統的性能。這一點在多線程編程時應該注意。
Win32 SDK函數支持進行多線程的程序設計,並提供了操作系統原理中的各種同步、互斥和臨界區等操作。Visual C++ 6.0中,使用MFC類庫也實現了多線程的程序設計,使得多線程編程更加方便。

三、Win32 API對多線程編程的支持

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

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

該函數在其調用進程的進程空間里創建一個新的線程,並返回已建線程的句柄,其中各參數說明如下:
lpThreadAttributes:指向一個 SECURITY_ATTRIBUTES 結構的指針,該結構決定了線程的安全屬性,一般置為 NULL;
dwStackSize:指定了線程的堆棧深度,一般都設置為0;
lpStartAddress:表示新線程開始執行時代碼所在函數的地址,即線程的起始地址。一般情況為(LPTHREAD_START_ROUTINE)ThreadFunc,ThreadFunc 是線程函數名;
lpParameter:指定了線程執行時傳送給線程的32位參數,即線程函數的參數;
dwCreationFlags:控制線程創建的附加標志,可以取兩種值。如果該參數為0,線程在被創建後就會立即開始執行;如果該參數為CREATE_SUSPENDED,則系統產生線程後,該線程處於掛起狀態,並不馬上執行,直至函數ResumeThread被調用;
lpThreadId:該參數返回所創建線程的ID;如果創建成功則返回線程的句柄,否則返回NULL。

2、DWORD SuspendThread(HANDLE hThread);
該函數用於掛起指定的線程,如果函數執行成功,則線程的執行被終止。

3、DWORD ResumeThread(HANDLE hThread);
該函數用於結束線程的掛起狀態,執行線程。

4、VOID ExitThread(DWORD dwExitCode);
該函數用於線程終結自身的執行,主要在線程的執行函數中被調用。其中參數dwExitCode用來設置線程的退出碼。

5、BOOL TerminateThread(HANDLE hThread,DWORD dwExitCode);
一般情況下,線程運行結束之後,線程函數正常返回,但是應用程序可以調用TerminateThread強行終止某一線程的執行。各參數含義如下:
hThread:將被終結的線程的句柄;
dwExitCode:用於指定線程的退出碼。
使用TerminateThread()終止某個線程的執行是不安全的,可能會引起系統不穩定;雖然該函數立即終止線程的執行,但並不釋放線程所佔用的資源。因此,一般不建議使用該函數。

6、BOOL PostThreadMessage(DWORD idThread,
UINT Msg,
WPARAM wParam,
LPARAM lParam);
該函數將一條消息放入到指定線程的消息隊列中,並且不等到消息被該線程處理時便返回。
idThread:將接收消息的線程的ID;
Msg:指定用來發送的消息;
wParam:同消息有關的字參數;
lParam:同消息有關的長參數;
調用該函數時,如果即將接收消息的線程沒有創建消息循環,則該函數執行失敗。

四、Win32 API多線程編程常式

常式1 MultiThread1
建立一個基於對話框的工程MultiThread1,在對話框IDD_MULTITHREAD1_DIALOG中加入兩個按鈕和一個編輯框,兩個按鈕的ID分別是IDC_START,IDC_STOP ,標題分別為「啟動」,「停止」,IDC_STOP的屬性選中Disabled;編輯框的ID為IDC_TIME ,屬性選中Read-only;
在MultiThread1Dlg.h文件中添加線程函數聲明: void ThreadFunc();
注意,線程函數的聲明應在類CMultiThread1Dlg的外部。 在類CMultiThread1Dlg內部添加protected型變數: HANDLE hThread;DWORD ThreadID;分別代表線程的句柄和ID。
在MultiThread1Dlg.cpp文件中添加全局變數m_bRun:volatile BOOL m_bRun;m_bRun 代表線程是否正在運行。
你要留意到全局變數 m_bRun 是使用 volatile 修飾符的,volatile 修飾符的作用是告訴編譯器無需對該變數作任何的優化,即無需將它放到一個寄存器中,並且該值可被外部改變。對於多線程引用的全局變數來說,volatile 是一個非常重要的修飾符。

編寫線程函數:
void ThreadFunc()
{
CTime time;
CString strTime;
m_bRun=TRUE;
while(m_bRun)
{
time=CTime::GetCurrentTime();
strTime=time.Format("%H:%M:%S");
::SetDlgItemText(AfxGetMainWnd()->m_hWnd,IDC_TIME,strTime);
Sleep(1000);
}
}

該線程函數沒有參數,也不返回函數值。只要m_bRun為TRUE,線程一直運行。
雙擊IDC_START按鈕,完成該按鈕的消息函數: void CMultiThread1Dlg::OnStart()
{
// TODO: Add your control notification handler code here
hThread=CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)ThreadFunc,
NULL,
0,
&ThreadID);
GetDlgItem(IDC_START)->EnableWindow(FALSE);
GetDlgItem(IDC_STOP)->EnableWindow(TRUE);

}

雙擊IDC_STOP按鈕,完成該按鈕的消息函數: void CMultiThread1Dlg::OnStop()
{
// TODO: Add your control notification handler code here
m_bRun=FALSE;
GetDlgItem(IDC_START)->EnableWindow(TRUE);
GetDlgItem(IDC_STOP)->EnableWindow(FALSE);
}

編譯並運行該常式,體會使用Win32 API編寫的多線程。

常式2 MultiThread2
該線程演示了如何傳送一個一個整型的參數到一個線程中,以及如何等待一個線程完成處理。
建立一個基於對話框的工程MultiThread2,在對話框IDD_MULTITHREAD2_DIALOG中加入一個編輯框和一個按鈕,ID分別是IDC_COUNT,IDC_START ,按鈕控制項的標題為「開始」; 在MultiThread2Dlg.h文件中添加線程函數聲明: void ThreadFunc(int integer);注意,線程函數的聲明應在類CMultiThread2Dlg的外部。在類CMultiThread2Dlg內部添加protected型變數: HANDLE hThread;DWORD ThreadID;分別代表線程的句柄和ID。打開ClassWizard,為編輯框IDC_COUNT添加int型變數m_nCount。
在MultiThread2Dlg.cpp文件中添加:
void ThreadFunc(int integer)
{
int i;
for(i=0;i<integer;i++)
{
Beep(200,50);
Sleep(1000);
}
}

雙擊IDC_START按鈕,完成該按鈕的消息函數:
void CMultiThread2Dlg::OnStart()
{
UpdateData(TRUE);
int integer=m_nCount;
hThread=CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)ThreadFunc,
(VOID*)integer,
0,
&ThreadID);
GetDlgItem(IDC_START)->EnableWindow(FALSE);
WaitForSingleObject(hThread,INFINITE);
GetDlgItem(IDC_START)->EnableWindow(TRUE);
}

順便說一下WaitForSingleObject函數,其函數原型為:DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds);
hHandle為要監視的對象(一般為同步對象,也可以是線程)的句柄;
dwMilliseconds為hHandle對象所設置的超時值,單位為毫秒;
當在某一線程中調用該函數時,線程暫時掛起,系統監視hHandle所指向的對象的狀態。如果在掛起的dwMilliseconds毫秒內,線程所等待的對象變為有信號狀態,則該函數立即返回;如果超時時間已經到達dwMilliseconds毫秒,但hHandle所指向的對象還沒有變成有信號狀態,函數照樣返回。參數dwMilliseconds有兩個具有特殊意義的值:0和INFINITE。若為0,則該函數立即返回;若為INFINITE,則線程一直被掛起,直到hHandle所指向的對象變為有信號狀態時為止。
本常式調用該函數的作用是按下IDC_START按鈕後,一直等到線程返回,再恢復IDC_START按鈕正常狀態。編譯運行該常式並細心體會。

常式3 MultiThread3
傳送一個結構體給一個線程函數也是可能的,可以通過傳送一個指向結構體的指針參數來完成。先定義一個結構體:
typedef struct
{
int firstArgu,
long secondArgu,

}myType,*pMyType;

創建線程時CreateThread(NULL,0,threadFunc,pMyType,…);
在threadFunc函數內部,可以使用「強制轉換」:
int intValue=((pMyType)lpvoid)->firstArgu;
long longValue=((pMyType)lpvoid)->seconddArgu;
……

MultiThread3將演示如何傳送一個指向結構體的指針參數。
建立一個基於對話框的工程MultiThread3,在對話框IDD_MULTITHREAD3_DIALOG中加入一個編輯框IDC_MILLISECOND,一個按鈕IDC_START,標題為「開始」 ,一個進度條IDC_PROGRESS1;打開ClassWizard,為編輯框IDC_MILLISECOND添加int型變數m_nMilliSecond,為進度條IDC_PROGRESS1添加CProgressCtrl型變數m_ctrlProgress;
在MultiThread3Dlg.h文件中添加一個結構的定義:
struct threadInfo
{
UINT nMilliSecond;
CProgressCtrl* pctrlProgress;
};

線程函數的聲明: UINT ThreadFunc(LPVOID lpParam);
注意,二者應在類CMultiThread3Dlg的外部。
在類CMultiThread3Dlg內部添加protected型變數: HANDLE hThread;DWORD ThreadID;分別代表線程的句柄和ID。
在MultiThread3Dlg.cpp文件中進行如下操作:
定義公共變數 threadInfo Info;
雙擊按鈕IDC_START,添加相應消息處理函數:
void CMultiThread3Dlg::OnStart()
{
// TODO: Add your control notification handler code here

UpdateData(TRUE);
Info.nMilliSecond=m_nMilliSecond;
Info.pctrlProgress=&m_ctrlProgress;

hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc,&Info,0,&ThreadID);
/*
GetDlgItem(IDC_START)->EnableWindow(FALSE);
WaitForSingleObject(hThread,INFINITE);
GetDlgItem(IDC_START)->EnableWindow(TRUE);
*/
}

在函數BOOL CMultiThread3Dlg::OnInitDialog()中添加語句:
{
……
// TODO: Add extra initialization here
m_ctrlProgress.SetRange(0,99);
m_nMilliSecond=10;
UpdateData(FALSE);
return TRUE; // return TRUE unless you set the focus to a control
}

添加線程處理函數:
UINT ThreadFunc(LPVOID lpParam) {
threadInfo* pInfo=(threadInfo*)lpParam;
for(int i=0;i<100;i++)
{
int nTemp=pInfo->nMilliSecond;

pInfo->pctrlProgress->SetPos(i);

Sleep(nTemp);
}
return 0;
}

順便補充一點,如果你在void CMultiThread3Dlg::OnStart() 函數中添加/* */語句,編譯運行你就會發現進度條不進行刷新,主線程也停止了反應。什麼原因呢?這是因為WaitForSingleObject函數等待子線程(ThreadFunc)結束時,導致了線程死鎖。因為WaitForSingleObject函數會將主線程掛起(任何消息都得不到處理),而子線程ThreadFunc正在設置進度條,一直在等待主線程將刷新消息處理完畢返回才會檢測通知事件。這樣兩個線程都在互相等待,死鎖發生了,編程時應注意避免。

常式4 MultiThread4
該常式測試在Windows下最多可創建線程的數目。
建立一個基於對話框的工程MultiThread4,在對話框IDD_MULTITHREAD4_DIALOG中加入一個按鈕IDC_TEST和一個編輯框IDC_COUNT,按鈕標題為「測試」 , 編輯框屬性選中Read-only;在MultiThread4Dlg.cpp文件中進行如下操作:添加公共變數volatile BOOL m_bRunFlag=TRUE; 該變數表示是否還能繼續創建線程。
添加線程函數:
DWORD WINAPI threadFunc(LPVOID threadNum)
{
while(m_bRunFlag)
{
Sleep(3000);
}
return 0;
}

只要 m_bRunFlag 變數為TRUE,線程一直運行。
雙擊按鈕IDC_TEST,添加其響應消息函數:
void CMultiThread4Dlg::OnTest()
{
DWORD threadID;
GetDlgItem(IDC_TEST)->EnableWindow(FALSE);
long nCount=0;
while(m_bRunFlag)
{
if(CreateThread(NULL,0,threadFunc,NULL,0,&threadID)==NULL)
{
m_bRunFlag=FALSE;
break;
}
else
{
nCount++;
}
}
//不斷創建線程,直到再不能創建為止
m_nCount=nCount;
UpdateData(FALSE);
Sleep(5000);
//延時5秒,等待所有創建的線程結束
GetDlgItem(IDC_TEST)->EnableWindow(TRUE);
m_bRunFlag=TRUE;
}

五、MFC對多線程編程的支持
MFC中有兩類線程,分別稱之為工作者線程和用戶界面線程。二者的主要區別在於工作者線程沒有消息循環,而用戶界面線程有自己的消息隊列和消息循環。
工作者線程沒有消息機制,通常用來執行後台計算和維護任務,如冗長的計算過程,列印機的後台列印等。用戶界面線程一般用於處理獨立於其他線程執行之外的用戶輸入,響應用戶及系統所產生的事件和消息等。但對於Win32的API編程而言,這兩種線程是沒有區別的,它們都只需線程的啟動地址即可啟動線程來執行任務。
在MFC中,一般用全局函數AfxBeginThread()來創建並初始化一個線程的運行,該函數有兩種重載形式,分別用於創建工作者線程和用戶界面線程。兩種重載函數原型和參數分別說明如下:

(1) CWinThread* AfxBeginThread(AFX_THREADPROC pfnThreadProc,
LPVOID pParam,
nPriority=THREAD_PRIORITY_NORMAL,
UINT nStackSize=0,
DWORD dwCreateFlags=0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL);

PfnThreadProc:指向工作者線程的執行函數的指針,線程函數原型必須聲明如下:
UINT ExecutingFunction(LPVOID pParam);
請注意,ExecutingFunction()應返回一個UINT類型的值,用以指明該函數結束的原因。一般情況下,返回0表明執行成功。
pParam:傳遞給線程函數的一個32位參數,執行函數將用某種方式解釋該值。它可以是數值,或是指向一個結構的指針,甚至可以被忽略;
nPriority:線程的優先順序。如果為0,則線程與其父線程具有相同的優先順序;
nStackSize:線程為自己分配堆棧的大小,其單位為位元組。如果nStackSize被設為0,則線程的堆棧被設置成與父線程堆棧相同大小;
dwCreateFlags:如果為0,則線程在創建後立刻開始執行。如果為CREATE_SUSPEND,則線程在創建後立刻被掛起;
lpSecurityAttrs:線程的安全屬性指針,一般為NULL;

(2) CWinThread* AfxBeginThread(CRuntimeClass* pThreadClass,
int nPriority=THREAD_PRIORITY_NORMAL,
UINT nStackSize=0,
DWORD dwCreateFlags=0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL);

pThreadClass 是指向 CWinThread 的一個導出類的運行時類對象的指針,該導出類定義了被創建的用戶界面線程的啟動、退出等;其它參數的意義同形式1。使用函數的這個原型生成的線程也有消息機制,在以後的例子中我們將發現同主線程的機制幾乎一樣。
下面我們對CWinThread類的數據成員及常用函數進行簡要說明。
m_hThread:當前線程的句柄;
m_nThreadID:當前線程的ID;
m_pMainWnd:指向應用程序主窗口的指針
BOOL CWinThread::CreateThread(DWORD dwCreateFlags=0,
UINT nStackSize=0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL);
該函數中的dwCreateFlags、nStackSize、lpSecurityAttrs參數和API函數CreateThread中的對應參數有相同含義,該函數執行成功,返回非0值,否則返回0。
一般情況下,調用AfxBeginThread()來一次性地創建並啟動一個線程,但是也可以通過兩步法來創建線程:首先創建CWinThread類的一個對象,然後調用該對象的成員函數CreateThread()來啟動該線程。

virtual BOOL CWinThread::InitInstance();

重載該函數以控制用戶界面線程實例的初始化。初始化成功則返回非0值,否則返回0。用戶界面線程經常重載該函數,工作者線程一般不使用InitInstance()。 virtual int CWinThread::ExitInstance();
在線程終結前重載該函數進行一些必要的清理工作。該函數返回線程的退出碼,0表示執行成功,非0值用來標識各種錯誤。同InitInstance()成員函數一樣,該函數也只適用於用戶界面線程。

六、MFC多線程編程實例
在Visual C++ 6.0編程環境中,我們既可以編寫C風格的32位Win32應用程序,也可以利用MFC類庫編寫C++風格的應用程序,二者各有其優缺點。基於Win32的應用程序執行代碼小巧,運行效率高,但要求程序員編寫的代碼較多,且需要管理系統提供給程序的所有資源;而基於MFC類庫的應用程序可以快速建立起應用程序,類庫為程序員提供了大量的封裝類,而且Developer Studio為程序員提供了一些工具來管理用戶源程序,其缺點是類庫代碼很龐大。由於使用類庫所帶來的快速、簡捷和功能強大等優越性,因此除非有特殊的需要,否則Visual C++推薦使用MFC類庫進行程序開發。
我們知道,MFC中的線程分為兩種:用戶界面線程和工作者線程。我們將分別舉例說明。
用 MFC 類庫編程實現工作者線程

常式5 MultiThread5
為了與Win32 API對照,我們使用MFC 類庫編程實現常式3 MultiThread3。
建立一個基於對話框的工程MultiThread5,在對話框IDD_MULTITHREAD5_DIALOG中加入一個編輯框IDC_MILLISECOND,一個按鈕IDC_START,標題為「開始」 ,一個進度條IDC_PROGRESS1;打開ClassWizard,為編輯框IDC_MILLISECOND添加int型變數m_nMilliSecond,為進度條IDC_PROGRESS1添加CProgressCtrl型變數m_ctrlProgress;
在MultiThread5Dlg.h文件中添加一個結構的定義:
struct threadInfo
{
UINT nMilliSecond;
CProgressCtrl* pctrlProgress;
};

線程函數的聲明:UINT ThreadFunc(LPVOID lpParam);
注意,二者應在類CMultiThread5Dlg的外部。
在類CMultiThread5Dlg內部添加protected型變數:CWinThread* pThread;
在MultiThread5Dlg.cpp文件中進行如下操作:定義公共變數:threadInfo Info;
雙擊按鈕IDC_START,添加相應消息處理函數:

void CMultiThread5Dlg::OnStart()
{
// TODO: Add your control notification handler code here

UpdateData(TRUE);
Info.nMilliSecond=m_nMilliSecond;
Info.pctrlProgress=&m_ctrlProgress;

pThread=AfxBeginThread(ThreadFunc,
&Info);
}

在函數BOOL CMultiThread3Dlg::OnInitDialog()中添加語句: {
……

// TODO: Add extra initialization here
m_ctrlProgress.SetRange(0,99);
m_nMilliSecond=10;
UpdateData(FALSE);
return TRUE; // return TRUE unless you set the focus to a control
}

添加線程處理函數:
UINT ThreadFunc(LPVOID lpParam)
{
threadInfo* pInfo=(threadInfo*)lpParam;
for(int i=0;i<100;i++)
{
int nTemp=pInfo->nMilliSecond;

pInfo->pctrlProgress->SetPos(i);

Sleep(nTemp);
}
return 0;
}

用 MFC 類庫編程實現用戶界面線程
創建用戶界面線程的步驟:使用ClassWizard創建類CWinThread的派生類(以CUIThread類為例)
class CUIThread : public CWinThread
{
DECLARE_DYNCREATE(CUIThread)
protected:
CUIThread(); // protected constructor used by dynamic creation

// Attributes
public:

// Operations
public:

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CUIThread)
public:
virtual BOOL InitInstance();
virtual int ExitInstance();
//}}AFX_VIRTUAL

// Implementation
protected:
virtual ~CUIThread();

// Generated message map functions
//{{AFX_MSG(CUIThread)
// NOTE - the ClassWizard will add and remove member functions here.
//}}AFX_MSG

DECLARE_MESSAGE_MAP()
};

重載函數InitInstance()和ExitInstance()。 BOOL CUIThread::InitInstance()
{
CFrameWnd* wnd=new CFrameWnd;
wnd->Create(NULL,"UI Thread Window");
wnd->ShowWindow(SW_SHOW);
wnd->UpdateWindow();
m_pMainWnd=wnd;
return TRUE;
}

創建新的用戶界面線程 void CUIThreadDlg::OnButton1()
{
CUIThread* pThread=new CUIThread();
pThread->CreateThread();
}

請注意以下兩點:
A、在UIThreadDlg.cpp的開頭加入語句: #include "UIThread.h"
B、把UIThread.h中類CUIThread()的構造函數的特性由 protected 改為 public。
用戶界面線程的執行次序與應用程序主線程相同,首先調用用戶界面線程類的InitInstance()函數,如果返回TRUE,繼續調用線程的Run()函數,該函數的作用是運行一個標準的消息循環,並且當收到WM_QUIT消息後中斷,在消息循環過程中,Run()函數檢測到線程空閑時(沒有消息),也將調用OnIdle()函數,最後Run()函數返回,MFC調用ExitInstance()函數清理資源。
你可以創建一個沒有界面而有消息循環的線程,例如:你可以從CWinThread派生一個新類,在InitInstance函數中完成某項任務並返回FALSE,這表示僅執行InitInstance函數中的任務而不執行消息循環,你可以通過這種方法,完成一個工作者線程的功能。

『肆』 MFC編程相對於其它編windows程難多少是不是MFC使用限制的比較多呢

學WTL吧,MFC真是逐步落伍了。
WTL 在開發者之間的悄悄傳播已經超過一年了, 傳聞它是基於ATL的,並在微軟內部使用.這理所當然的引起了ATL開發者社區的主意.這些人從ATL1.1開始,就一直為ATL控制項書寫UI代碼,但是他們發現,他們的所寫的代碼常常就是純的Win32 GDI代碼.我告訴您, WTL並沒有多大不同.

是不是讓人失望? 不,因為ATL只是對COM進行了簡單的封裝,這也是ATL的強大之處. 是的,寫ATL您必須通曉COM. 您在ATL上額外花費的功夫跟您學習COM所作的努力比起來,簡直微不足道.這跟那些需要把主要精力花費在學習類庫本身,忽略COM的庫是完全不同的.

WTL與此類似.您需要懂得Win32窗口技術和GDI.只要您懂得,學習WTL就似清風撫面,再簡單不過了.如果您不懂 這些,那麼您最好使用VB來寫UI代碼.

WTL有什麼?

它給各種類型的應用程序提供了一個基本的框架.注意,雖然您沒有MFC那樣的文檔/視結構,但是您有視(views). 在WTL有大量的代碼讓您來管理視,而且加入您自己的代碼也很容易. WTL有AppWizard,可以讓您生成SDI, MDI 和多線程SDI程序多線程SDI跟IE或Windows Explorer很像.它看起來是打開了多個程序實例,實際上這些窗口都是屬於一個進程的).

另外,您的程序可以是基於對話框的,也可以是基於視的.視可以是基於CWindowImpl的,也可以是基於控制項,甚至是IE里的一個HTML頁.您可以選擇您的程序是否需要一個rebar, command bar (CE-like), toolbar 和/或status bar.另外,您的程序可以主持ActiveX控制項,以及成為一個COM伺服器.

這里有幾個關於視的選項. WTL提供splitter窗口類(這樣在一個視里您可以有兩個窗口)和scroll窗口類(這樣您的窗口可以比它顯示的"視"小). WTL也有個類似MFC的UpDateUI的東西,但是它們不是很一樣 - 主要的區別是您需要把需要更新的項用宏映射標注出來,然後您在您的類里加入執行UpdateUI的代碼. DDX/DDV在WTL也支持,同樣類似MFC,但有不同. 您必須加一個宏映射來實現DoDataExchange,然後加入調用它的代碼.

現在WTL也有GDI類了.然而,HDC的封裝類就像CWindow一樣,只進行了很簡單的封裝 - 它幾乎沒有加入任何新的功能.不過,在WTL,你可以得到播放meta文件和OpenGL支持. 最有價值的我猜應該是列印機DC的那些繼承類 - WTL有列印機支持,甚至列印預覽. 當然也有GDI對象的封裝. 諸如畫筆,畫刷,區域等.

WTL對所有的Win32 (和W2K) 通用對話框進行了封裝.同樣盡管簡單,但是它的確使請求字體或者文件變的非常的簡單.
合成了舊的AtlControls.h,新加了一些封裝類. 這些封裝類封裝了W2K控制項,以及一些不屬於Win32的"控制項",像Command Bar, bitmap button, hyperlink 和 wait cursor.

WTL 最終把消息分離帶入了ATL! 一些新的MSG映射宏將消息分離,調用您類里的消息處理函數.消息處理函數的參數的值是從消息分離得到的.唯一令人頭痛的是,您需要查看頭文件以確定函數參數的意義.

最後,WTL還有一些實用類.最重要的是CString. 不錯,它是從MFC克隆得到的( on write),具有(在我知道的范圍內)MFC版本的所有方法.還有查找文件的API的封裝類,以及CRect, CSize and CPoint.

『伍』 各位QT大俠: QT多線程編程的時候,怎麼把次線程處理好的數據實時的顯示到ui上去

Qt上要求界面處理一般需要在主線程中完成。
所以最好把次線程中的數據緩沖區放到主線程中:
1、一種方式可以進行數據拷貝,但肯定效率低了。
2、另一種方式是直接將數據緩沖區放到主線程中,然後在主線程中處理讀取數據槽。但這樣可能主線程壓力大,機器配置不能太低。
3、直接在主線程中訪問次線程的數據並刷新界面,不過這處理起來復雜(需要手工同步),容易出錯。
4、將TableWidget指針傳入次線程中,直接在次線程中對其進行操作並發送刷新信號。這種方式未經驗證,感覺可能性不大:一方面指針容易走空,另一方面就是前面說的限制在主線程中對接面進行處理。不過所說的「處理」可能並不包括刷新數據吧。
期待樓主進行驗證,並展示結果。(或者樓主可以將UDP試驗項目發送給我,讓我試試,QQ:956693152,謝謝!)

『陸』 想學IT應該買什麼書看

首先,我覺得你需要明確自己的發展方向,你想學習的課程起碼串聯起來是個完整的體系,以後能夠幫助你就業

書籍整理如下:

C++開發

1.《C++ Primer》:全面學習C++的必備書籍

2.《Thinking in C++》:了解C++背後的一些機制

3.《深度探索C++對象模型》:深入了解C++,也是學習COM的必經之路

Windows平台

入門

1.《Windows程序設計》:這本書主要講的是Windows API的使用,是Windows編程入門書籍。上冊涉及到的知識基本上就夠用了,時間不充裕的話閱讀上冊即可。

2.《Win32多線程程序設計》:Windows下多線程編程必備

3.《Windows核心編程》:Window平台基礎知識:消息機制,內存管理,多線程,動態鏈接庫等

4.《Windows網路編程》:介紹Windows下各種網路協議的開發和並發處理模型。

進階

1.《深入淺出MFC》:Windows下編程,MFC雖然有些過時,但其機制還是有學習的價值。重點學習書中提到的MFC 6大機制

2.《COM本質論》:COM是Windows構建用戶態的重要技術之一,Windows開發必修課,本書對COM的設計動機作了深入闡述

3.《深入解析ATL》:ATL全名Active Templete Library,是用C++的模版封裝了COM,這本書主要講的是對源碼分析

4.《WTL White Paper》:WTL源自微軟,基於ATL的一套開源模版庫,主要用於界面編程和工具類的使用

5.《代碼大全》:這邊書主要講的是工程編碼規范

高級

1.《深入解析Windows操作系統》:Windows大牛書籍,講的主要是Windows操作系統的內核原理

調試技術

1.《軟體調試》

2.《Windows高級調試》

3.《windows用戶態程序高效排錯》

Linux平台

Linux內核

1.《Linux Kernel Development》/《Linux內核設計與實現》:Robert Love的著作,不厚的一本書,深入淺出地將Linux內核娓娓道來

Linux使用和Shell編程

1.《sed & awk》/《sed與awk》:sed與awk都是Linux下常用的日誌分析利器

Linux編程

1.《Beginning Linux Programming》/《Linux程序設計》:老牌的Linux編程入門書

2.《Advanced Programming in the Unix Environment》/《Unix環境高級編程》:對Unix編程環境做了細致的總結,涵蓋了進程間通訊、網路通訊、文件系統等各方面的知識

網路編程

1.《TCP/IP Illustrated, Volume I》/《TCP/IP詳解,卷一》:對理解TCP/IP協議的設計理念和協議細節有顯著的幫助。

2.《Unix Network Programming》/《Unix網路編程》,卷一、卷二:網路編程方面難以逾越的著作,事無巨細、深入淺出,強烈推薦

對這些書目抱有100%的信心,全部掌握,融會貫通,即可打通奇經八脈,天下無雙。

對了,你沒有基礎最好從c與c++基礎開始。找些基礎書開始看。

[C語言入門經典(第四版)].(美)霍頓.掃描版,《C++ Primer》就不錯。

『柒』 通過線程句柄和ID能獲得進程的句柄和ID嗎

在Windows中,句柄是一個系統內部數據結構的引用。例如,當你操作一個窗口,或說是一個Delphi窗體時,系統會給你一個該窗口的句柄,系統會通知你:你正在操作142號窗口,就此,你的應用程序就能要求系統對142號窗口進行操作——移動窗口、改變窗口大小、把窗口極小化為圖標,等等。實際上許多Windows API函數把句柄作為它的第一個參數,如GDI(圖形設備介面)句柄、菜單句柄、實例句柄、點陣圖句柄等等,不僅僅局限於窗口函數。

換句話說,句柄是一種內部代碼,通過它能引用受系統控制的特殊元素,如窗口、點陣圖、圖標、內存塊、游標、字體、菜單等等。

案例:獲取窗口句柄

案例說明

本例實現窗口句柄的獲取。

實現過程

Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long

Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Private Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long

Private Const WS_EX_LAYERED = &H80000

Private Const GWL_EXSTYLE = (-20)

Private Const LWA_ALPHA = &H2

Private Sub Form_Activate()

On Error Resume Next

For i = 0 To 150 Step 2.5

SetLayeredWindowAttributes Me.hwnd, 0, i, LWA_ALPHA

DoEvents

Next i

End Sub

Private Sub Form_load()

Dim rtn As Long

rtn = GetWindowLong(Me.hwnd, GWL_EXSTYLE)

rtn = rtn Or WS_EX_LAYERED

SetWindowLong Me.hwnd, GWL_EXSTYLE, rtn

SetLayeredWindowAttributes Me.hwnd, 0, 0, LWA_ALPHA

End Sub

單從概念上講,句柄指一個對象的標識,而指針是一個對象的首地址。從實際處理的角度講,即可以把句柄定義為指針,又可以把它定義為同類對象數組的索引,這兩種處理方法都有優缺點,至於選用哪種方式,完全應該看實際需要,這可以說是一種程序設計上的技巧。那種單純認為句柄是指針或索引的想法都是機械的、不確切的。

其實,在Windows中類似的處理是很多的、很靈活的。再具個相似的例子:

我們知道,在Windows中有個函數叫做CallWindowProc。顧名思義,它的作用就是向指定的窗口過程傳遞一個消息。你也許會想,既然我已經有了窗口過程的指針,為什麼我不可以直接通過這個指針調用該函數(這是C語言的內建功能)?事實上,在Win16中確實可以這么做,因為GetWindowLong返回的確實是該函數的指針。但在Win32下,GetWindowLong返回的並不是該函數的指針,而是一個包含函數指針的數據結構的指針(MSDN上說返回的是一個窗口函數地址或它的句柄,就是指的這種情況)。該數據結構是可變的,但只要你使用CallWindowProc來調用的話是不會出錯的。這里我們又看到使用句柄處理帶來的好處。(補充說明一點:微軟在這里之所以這么處理,是為了解決16位/32位以及ANSI/UNICODE的轉化問題)

1.句柄是什麼?

在windows中,句柄是和對象一一對應的32位無符號整數值。對象可以映射到唯

一的句柄,句柄也可以映射到唯一的對象。

2.為什麼我們需要句柄?

更准確地說,是windows需要句柄。windows需要向程序員提供必要地編程介面

,在這些介面中,允許程序員訪問、創建和銷毀對象。但是,出於封裝地考慮,wi

ndows並不想向程序員返回指針。指針包含了太多的信息。首先指針給出了對象存儲

的確切位置;其次,要操作一個指針,程序員必須知道指針所指對象的內部結構特

征,也即,windows必須向程序員暴露相應的數據結構,而這些數據結構也許是操作

系統想向程序員隱藏的。

如果說COM技術向用戶隱藏了數據,只暴露了介面並只允許按介面定義的方法操

作數據的話,句柄這種方式則允許你按自己的方式直接操作數據,但windows又不向

你直接暴露數據。直接操作數據是程序員需要的,不暴露數據是windows所需要的,

句柄封裝方式實現了各取所需。

3.句柄如何與對象映射?

封裝背後,必須有一個地方可以實現解碼,以實現句柄和對象的相互轉換。在

windows中,存在兩種映射方式:

a. 全等映射。也即,句柄本身就是一個指針。映射在這里只是類型轉換而已。

這種情況有,進程實例句柄或模塊句柄,以及資源句柄等等。

b. 基於表格的映射。這是對象指針與句柄之間最普通的映射機制。操作系統創

建表格,並保存所有要考慮的對象。需要創建新對象時,要先在表格中找到空入口

,然後把表示對象的數據添入其中。當對象被刪除時,它的數據成員和其在表中的

入口被釋放。

4.句柄的定義和實現

我們以GDI對象為例進行討論。創建了GDI對象,就會得到該對象的句柄。句柄

的對象可能是HBRUSH、HPEN、HFONT或HDC中的一種,這依賴於你創建 的GDI對象類

型。但是最普通的GDI對象類型是HGDIOBJ。HGDIOBJ被定義成空指針。

HPEN的實際編譯類型定義隨編譯時間宏STRICT的不同而不同。如果STRCIT已經

被定義了,HPEN是這樣的:

struct HPEN__ {int unused};

typedef struct HPEN__* HPEN;

如果STRICT沒有定義,HPEN是這樣定義的:

typedef void *HANDLE;

typedef HANDLE HPEN;

上面這段代碼是一個注重細節的程序員最接近句柄的地方,因此我們重點分析

一下。這里有一點點技巧。如果定義了STRICT宏,HPEN是指向有單個未使用欄位的

結構的指針,否則HPEN是空指針。C/C++編譯器允許把任何類型的指針作為空指什傳

遞,反之則不可以。兩個不同類型的非空指針是互不兼容的。在STRICT版本中,編

譯對GDI對象句柄的不正確混用將給出警告,對於非GDI句柄,如HWND、HMENU的不正

確混用也會給出警告,從而使程序在編譯器得到更STRICT的檢查。

接下來的分析可能不那麼令你感興趣,但它更深刻地揭示了句柄。對GDI句柄來

說,盡管windows頭文件把它定義成指針,但如果你仔細檢查這些句柄的值,它根本

就不像指針,這也是為什麼我說它只是一個32位無符整數值的原因。對句柄就是指

針的情況,這句話也仍然適用。讓我們隨意地生成一些句柄,比如你用GetStockOb

ject()以得到一些句柄,你會發現,它們的值總在區間0x01900011到0xba040389。

前者指向用戶區中的未分配的無效區域,後者指向內核地址空間。另外你可能發現

,兩個句柄之間的值可能只差數值1,這也說明GDI句柄不是指針。

和多數人想像的不一樣,句柄也不是一個單純的索引值。對GDI對象句柄來說,

GDI句柄由8位 、1位堆對象標記(表明對象是否創建在堆中)、7位對象類型信息和

高4位為0的16位索引組成,如圖:

3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0

1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0

| 8 位引用計數 |堆 | 對象類型7 | 16位索引 |





在這里你可以看到,對GDI來說,它只使用了16位作為索引。這意味著一個進程最多隻

可以創建小於64K個句柄,實際上受其他一些限制,整個Windows系統中大概可以容納約

16384(0x4000)個GDI對象。
============================
進程ID
ID是英文IDentity的縮寫,ID是身份標識號碼的意思很多設備都有的一個識別好嗎比如說硬碟就有id號,所有的商品都有一個id,正規的應該是唯一的
identification,意思是身份,身份證用的是這個詞,
還有你在網上登陸論壇什麼的,都有個虛擬的ID,就像是你的身份證一樣,用以區別,你的昵稱可以和別人的相同但是ID確不能相同的。
進程ID顧名思義
知道進程ID我們可以結束進程
進程對象是一種內核對象,每個內核對象實際上是由內核分配的一塊內存,而且只能由內核來訪問。這一內存塊是一個數據結構,它的成員包含有關於該對象的信息。因為內核對象只能由內核訪問,所以應用程序不可能在內存中定位這些數據結構和直接改變它們的內容。為了達到操縱這些內核對象的目的,win32API以良好的方式提供了一組操縱這些結構的函數,對內核對象的訪問總是通過這些函數,當調用創建內核對象的函數時,函數返回一個標志該對象的句柄,它是一個32位的數值,可以被進程中的任意線程使用,可以把它傳給各種WIN32函數,這樣系統就知道想要操縱的是哪一個內核對象。

而進程被創建時,系統會賦給它一個唯一的標識符,就是進程ID。系統中運行的其他進程不會有相同的ID值,這個值也是可以被使用的,例如父進程可以通過創建子進程時得到的ID來和子進程通信。
==========================================
所謂句柄實際上是一個數據,是一個Long (整長型)的數據。

句柄是WONDOWS用來標識被應用程序所建立或使用的對象的唯一整數,WINDOWS使用各種各樣的句柄標識諸如應用程序實例,窗口,控制,點陣圖,GDI對象等等。WINDOWS句柄有點象C語言中的文件句柄。

從上面的定義中的我們可以看到,句柄是一個標識符,是拿來標識對象或者項目的,它就象我們的姓名一樣,每個人都會有一個,不同的人的姓名不一樣,但是,也可能有一個名字和你一樣的人。從數據類型上來看它只是一個16位的無符號整數。應用程序幾乎總是通過調用一個WINDOWS函數來獲得一個句柄,之後其他的WINDOWS函數就可以使用該句柄,以引用相應的對象。

如果想更透徹一點地認識句柄,我可以告訴大家,句柄是一種指向指針的指針。我們知道,所謂指針是一種內存地址。應用程序啟動後,組成這個程序的各對象是住留在內存的。如果簡單地理解,似乎我們只要獲知這個內存的首地址,那麼就可以隨時用這個地址訪問對象。但是,如果您真的這樣認為,那麼您就大錯特錯了。我們知道,Windows是一個以虛擬內存為基礎的操作系統。在這種系統環境下,Windows內存管理器經常在內存中來回移動對象,依此來滿足各種應用程序的內存需要。對象被移動意味著它的地址變化了。如果地址總是如此變化,我們該到哪裡去找該對象呢?

為了解決這個問題,Windows操作系統為各應用程序騰出一些內存儲地址,用來專門登記各應用對象在內存中的地址變化,而這個地址(存儲單元的位置)本身是不變的。Windows內存管理器在移動對象在內存中的位置後,把對象新的地址告知這個句柄地址來保存。這樣我們只需記住這個句柄地址就可以間接地知道對象具體在內存中的哪個位置。這個地址是在對象裝載(Load)時由系統分配給的,當系統卸載時(Unload)又釋放給系統。

句柄地址(穩定)→記載著對象在內存中的地址————→對象在內存中的地址(不穩定)→實際對象

本質:WINDOWS程序中並不是用物理地址來標識一個內存塊,文件,任務或動態裝入模塊的,相反的,WINDOWS API給這些項目分配確定的句柄,並將句柄返回給應用程序,然後通過句柄來進行操作。

但是必須注意的是程序每次從新啟動,系統不能保證分配給這個程序的句柄還是原來的那個句柄,而且絕大多數情況的確不一樣的。假如我們把進入電影院看電影看成是一個應用程序的啟動運行,那麼系統給應用程序分配的句柄總是不一樣,這和每次電影院售給我們的門票總是不同的一個座位是一樣的道理。

線程是指程序的一個指令執行序列,WIN32 平台支持多線程程序,允許程序中存在多個線程。 在單 CPU 系統中,系統把 CPU 的時間片按照調度演算法分配給各個線程,因此各線程實際上是分時執行的,在多 CPU 的 Windows NT 系統中, 同一個程序的不同線程可以被分配到不同的 CPU 上去執行。由於一個程序的各線程是在相同的地址空間運行的,因此設及到了如何共享內存, 如何通信等問題,這樣便需要處理各線程之間的同步問題,這是多線程編程中的一個難點。

線程,也被稱為輕量進程(lightweight processes)。計算機科學術語,指運行中的程序的調度單位。

線程是進程中的實體,一個進程可以擁有多個線程,一個線程必須有一個父進程。線程不擁有系統資源,只有運行必須的一些數據結構;它與父進程的其它線程共享該進程所擁有的全部資源。線程可以創建和撤消線程,從而實現程序的並發執行。一般,線程具有就緒、阻塞和運行三種基本狀態。

在多中央處理器的系統里,不同線程可以同時在不同的中央處理器上運行,甚至當它們屬於同一個進程時也是如此。大多數支持多處理器的操作系統都提供編程介面來讓進程可以控制自己的線程與各處理器之間的關聯度(affinity)。

進程是程序在一個數據集合上運行的過程(注:一個程序有可能同時屬於

多個進程),它是操作系統進行資源分配和調度的一個獨立單位,進程可以簡單的分為系統進程(包括一般

Windows程序和服務進程)和用戶進程

句柄:用於唯一標識資源(例如文件和注冊表項)的值,以便程序可以訪問它。
線程:在運行程序指令的進程中的對象,線程允許在進程中進行並發操作,並使一個進程能在不同處理器上同時運行其程序的不同部分。
進程:一個可執行程序(如WINDOWS資源管理器)或一種服務(如MSTask)。

『捌』 如何使用 AfxBeginThread創建MFC線程對象和Win32線程對象

一、問題的提出
編寫一個耗時的單線程程序:
新建一個基於對話框的應用程序SingleThread,在主對話框IDD_SINGLETHREAD_DIALOG添加一個按鈕,ID為IDC_SLEEP_SIX_SECOND,標題為

「延時6秒」,添加按鈕的響應函數,代碼如下:

void CSingleThreadDlg::OnSleepSixSecond()
{
Sleep(6000); //延時6秒
}
編譯並運行應用程序,單擊「延時6秒」按鈕,你就會發現在這6秒期間程序就象「死機」一樣,不在響應其它消息。為了更好地處理這種

耗時的操作,我們有必要學習——多線程編程。
二、多線程概述
進程和線程都是操作系統的概念。進程是應用程序的執行實例,每個進程是由私有的虛擬地址空間、代碼、數據和其它各種系統資源組成

,進程在運行過程中創建的資源隨著進程的終止而被銷毀,所使用的系統資源在進程終止時被釋放或關閉。
線程是進程內部的一個執行單元。系統創建好進程後,實際上就啟動執行了該進程的主執行線程,主執行線程以函數地址形式,比如說

main或WinMain函數,將程序的啟動點提供給Windows系統。主執行線程終止了,進程也就隨之終止。
每一個進程至少有一個主執行線程,它無需由用戶去主動創建,是由系統自動創建的。用戶根據需要在應用程序中創建其它線程,多個線程並發地運行於同一個進程中。一個進程中的所有線程都在該進程的虛擬地址空間中,共同使用這些虛擬地址空間、全局變數和系統資源,所

以線程間的通訊非常方便,多線程技術的應用也較為廣泛。
多線程可以實現並行處理,避免了某項任務長時間佔用CPU時間。要說明的一點是,目前大多數的計算機都是單處理器(CPU)的,為了運行所有這些線程,操作系統為每個獨立線程安排一些CPU時間,操作系統以輪換方式向線程提供時間片,這就給人一種假象,好象這些線程都在

同時運行。由此可見,如果兩個非常活躍的線程為了搶奪對CPU的控制權,在線程切換時會消耗很多的CPU資源,反而會降低系統的性能。這一點在多線程編程時應該注意。
Win32 SDK函數支持進行多線程的程序設計,並提供了操作系統原理中的各種同步、互斥和臨界區等操作。Visual C++6.0中,使用MFC類庫也實現了多線程的程序設計,使得多線程編程更加方便。
三、Win32 API對多線程編程的支持
Win32 提供了一系列的API函數來完成線程的創建、掛起、恢復、終結以及通信等工作。下面將選取其中的一些重要函數進行說明。
1、HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,
DWORD dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId);
該函數在其調用進程的進程空間里創建一個新的線程,並返回已建線程的句柄,其中各參數說明如下:
lpThreadAttributes:指向一個 SECURITY_ATTRIBUTES 結構的指針,該結構決定了線程的安全屬性,一般置為 NULL;
dwStackSize:指定了線程的堆棧深度,一般都設置為0;
lpStartAddress:表示新線程開始執行時代碼所在函數的地址,即線程的起始地址。一般情況為(LPTHREAD_START_ROUTINE)ThreadFunc,

ThreadFunc
是線程函數名;
lpParameter:指定了線程執行時傳送給線程的32位參數,即線程函數的參數;
dwCreationFlags:控制線程創建的附加標志,可以取兩種值。如果該參數為0,線程在被創建後就會立即開始執行;如果該參數為CREATE_SUSPENDED,則系統產生線程後,該線程處於掛起狀態,並不馬上執行,直至函數ResumeThread被調用;

lpThreadId:該參數返回所創建線程的ID;
如果創建成功則返回線程的句柄,否則返回NULL。
2、DWORD SuspendThread(HANDLE hThread);
該函數用於掛起指定的線程,如果函數執行成功,則線程的執行被終止。 3、DWORD ResumeThread(HANDLE hThread);
該函數用於結束線程的掛起狀態,執行線程。
4、VOID ExitThread(DWORD dwExitCode);
該函數用於線程終結自身的執行,主要在線程的執行函數中被調用。其中參數dwExitCode用來設置線程的退出碼。
5、BOOL TerminateThread(HANDLE hThread,DWORD dwExitCode);
一般情況下,線程運行結束之後,線程函數正常返回,但是應用程序可以調用TerminateThread強行終止某一線程的執行。各參數含義如下:
hThread:將被終結的線程的句柄;
dwExitCode:用於指定線程的退出碼。
使用TerminateThread()終止某個線程的執行是不安全的,可能會引起系統不穩定;雖然該函數立即終止線程的執行,但並不釋放線程所佔用的資源。因此,一般不建議使用該函數。

6、BOOL PostThreadMessage(DWORD idThread,
UINT Msg,
WPARAM wParam,
LPARAM lParam);
該函數將一條消息放入到指定線程的消息隊列中,並且不等到消息被該線程處理時便返回。
idThread:將接收消息的線程的ID;
Msg:指定用來發送的消息;
wParam:同消息有關的字參數;
lParam:同消息有關的長參數;
調用該函數時,如果即將接收消息的線程沒有創建消息循環,則該函數執行失敗。
四、Win32 API多線程編程常式
常式1 MultiThread1
建立一個基於對話框的工程MultiThread1,在對話框IDD_MULTITHREAD1_DIALOG中加入兩個按鈕和一個編輯框,兩個按鈕的ID分別是IDC_START,IDC_STOP
,標題分別為「啟動」,「停止」,IDC_STOP的屬性選中Disabled;編輯框的ID為IDC_TIME ,屬性選中Read-only;

在MultiThread1Dlg.h文件中添加線程函數聲明: void ThreadFunc();
注意,線程函數的聲明應在類CMultiThread1Dlg的外部。在類CMultiThread1Dlg內部添加protected型變數: HANDLE
hThread;
DWORD ThreadID;
分別代表線程的句柄和ID。

在MultiThread1Dlg.cpp文件中添加全局變數m_bRun : volatile BOOL m_bRun;
m_bRun 代表線程是否正在運行。
你要留意到全局變數 m_bRun 是使用 volatile 修飾符的,volatile
修飾符的作用是告訴編譯器無需對該變數作任何的優化,即無需將它放到一個寄存器中,並且該值可被外部改變。對於多線程引用的全局變數

來說,volatile
是一個非常重要的修飾符。
編寫線程函數: void ThreadFunc()
{
CTime time;
CString strTime;
m_bRun=TRUE;
while(m_bRun)
{
time=CTime::GetCurrentTime();
strTime=time.Format("%H:%M:%S");
::SetDlgItemText(AfxGetMainWnd()->m_hWnd,IDC_TIME,strTime);
Sleep(1000);
}
}
該線程函數沒有參數,也不返回函數值。只要m_bRun為TRUE,線程一直運行。
雙擊IDC_START按鈕,完成該按鈕的消息函數:
void CMultiThread1Dlg::OnStart()
{
// TODO: Add your control notification handler code here
hThread=CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)ThreadFunc,
NULL,
0,
&ThreadID);
GetDlgItem(IDC_START)->EnableWindow(FALSE);
GetDlgItem(IDC_STOP)->EnableWindow(TRUE);
}
雙擊IDC_STOP按鈕,完成該按鈕的消息函數: void CMultiThread1Dlg::OnStop()
{
// TODO: Add your control notification handler code here
m_bRun=FALSE;
GetDlgItem(IDC_START)->EnableWindow(TRUE);
GetDlgItem(IDC_STOP)->EnableWindow(FALSE);
}
編譯並運行該常式,體會使用Win32 API編寫的多線程。

常式2 MultiThread2
該線程演示了如何傳送一個一個整型的參數到一個線程中,以及如何等待一個線程完成處理。
建立一個基於對話框的工程MultiThread2,在對話框IDD_MULTITHREAD2_DIALOG中加入一個編輯框和一個按鈕,ID分別是IDC_COUNT,IDC_START
,按鈕控制項的標題為「開始」;
在MultiThread2Dlg.h文件中添加線程函數聲明: void ThreadFunc(int integer);
注意,線程函數的聲明應在類CMultiThread2Dlg的外部。
在類CMultiThread2Dlg內部添加protected型變數: HANDLE hThread;
DWORD ThreadID;
分別代表線程的句柄和ID。

打開ClassWizard,為編輯框IDC_COUNT添加int型變數m_nCount。在MultiThread2Dlg.cpp文件中添加:void
ThreadFunc(int integer)
{
int i;
for(i=0;i<integer;i++)
{
Beep(200,50);
Sleep(1000);
}
}
雙擊IDC_START按鈕,完成該按鈕的消息函數: void CMultiThread2Dlg::OnStart()
{
UpdateData(TRUE);
int integer=m_nCount;
hThread=CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)ThreadFunc,
(VOID*)integer,
0,
&ThreadID);
GetDlgItem(IDC_START)->EnableWindow(FALSE);
WaitForSingleObject(hThread,INFINITE);
GetDlgItem(IDC_START)->EnableWindow(TRUE);
}
順便說一下WaitForSingleObject函數,其函數原型為:DWORD WaitForSingleObject(HANDLE hHandle,DWORD
dwMilliseconds);
hHandle為要監視的對象(一般為同步對象,也可以是線程)的句柄;
dwMilliseconds為hHandle對象所設置的超時值,單位為毫秒;
當在某一線程中調用該函數時,線程暫時掛起,系統監視hHandle所指向的對象的狀態。如果在掛起的dwMilliseconds毫秒內,線程所等待

的對象變為有信號狀態,則該函數立即返回;如果超時時間已經到達dwMilliseconds毫秒,但hHandle所指向的對象還沒有變成有信號狀態,函

數照樣返回。參數dwMilliseconds有兩個具有特殊意義的值:0和INFINITE。若為0,則該函數立即返回;若為INFINITE,則線程一直被掛起,

直到hHandle所指向的對象變為有信號狀態時為止。
本常式調用該函數的作用是按下IDC_START按鈕後,一直等到線程返回,再恢復IDC_START按鈕正常狀態。編譯運行該常式並細心體會。
常式3 MultiThread3
傳送一個結構體給一個線程函數也是可能的,可以通過傳送一個指向結構體的指針參數來完成。先定義一個結構體:
typedef struct
{
int firstArgu,
long secondArgu,

}myType,*pMyType;
創建線程時CreateThread(NULL,0,threadFunc,pMyType,…);
在threadFunc函數內部,可以使用「強制轉換」:
int intValue=((pMyType)lpvoid)->firstArgu;
long longValue=((pMyType)lpvoid)->seconddArgu;
……
常式3 MultiThread3將演示如何傳送一個指向結構體的指針參數。
建立一個基於對話框的工程MultiThread3,在對話框IDD_MULTITHREAD3_DIALOG中加入一個編輯框IDC_MILLISECOND,一個按鈕IDC_START,標題

為「開始」
,一個進度條IDC_PROGRESS1;
打開ClassWizard,為編輯框IDC_MILLISECOND添加int型變數m_nMilliSecond,為進度條IDC_PROGRESS1添加CProgressCtrl型變數

m_ctrlProgress;

在MultiThread3Dlg.h文件中添加一個結構的定義: struct threadInfo
{
UINT nMilliSecond;
CProgressCtrl* pctrlProgress;
};
線程函數的聲明: UINT ThreadFunc(LPVOID lpParam);
注意,二者應在類CMultiThread3Dlg的外部。
在類CMultiThread3Dlg內部添加protected型變數: HANDLE hThread;
DWORD ThreadID;
分別代表線程的句柄和ID。
在MultiThread3Dlg.cpp文件中進行如下操作:
定義公共變數 threadInfo Info;
雙擊按鈕IDC_START,添加相應消息處理函數:void CMultiThread3Dlg::OnStart()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
Info.nMilliSecond=m_nMilliSecond;
Info.pctrlProgress=&m_ctrlProgress;
hThread=CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)ThreadFunc,
&Info,
0,
&ThreadID);

}
在函數BOOL CMultiThread3Dlg::OnInitDialog()中添加語句: {
……

// TODO: Add extra initialization here
m_ctrlProgress.SetRange(0,99);
m_nMilliSecond=10;
UpdateData(FALSE);
return TRUE; // return TRUE unless you set the focus to a control
}
添加線程處理函數:UINT ThreadFunc(LPVOID lpParam) {
threadInfo* pInfo=(threadInfo*)lpParam;
for(int i=0;i<100;i++)
{
int nTemp=pInfo->nMilliSecond;
pInfo->pctrlProgress->SetPos(i);
Sleep(nTemp);
}
return 0;
}
順便補充一點,如果你在void CMultiThread3Dlg::OnStart() 函數中添加語句,編譯運行你就會發現進度條不進行刷新,主線程也停止了反應。什麼原因呢?這是因為WaitForSingleObject函數等待子線程

(ThreadFunc)結束時,導致了線程死鎖。因為WaitForSingleObject函數會將主線程掛起(任何消息都得不到處理),而子線程ThreadFunc正

在設置進度條,一直在等待主線程將刷新消息處理完畢返回才會檢測通知事件。這樣兩個線程都在互相等待,死鎖發生了,編程時應注意避免



常式4 MultiThread4
該常式測試在Windows下最多可創建線程的數目。

建立一個基於對話框的工程MultiThread4,在對話框IDD_MULTITHREAD4_DIALOG中加入一個按鈕IDC_TEST和一個編輯框IDC_COUNT,按鈕標題為

「測試」
, 編輯框屬性選中Read-only;
在MultiThread4Dlg.cpp文件中進行如下操作:
添加公共變數volatile BOOL m_bRunFlag=TRUE;
該變數表示是否還能繼續創建線程。
添加線程函數:
DWORD WINAPI threadFunc(LPVOID threadNum)
{
while(m_bRunFlag)
{
Sleep(3000);
}
return 0;
}
只要 m_bRunFlag 變數為TRUE,線程一直運行。
雙擊按鈕IDC_TEST,添加其響應消息函數:void CMultiThread4Dlg::OnTest()
{
DWORD threadID;
GetDlgItem(IDC_TEST)->EnableWindow(FALSE);
long nCount=0;
while(m_bRunFlag)
{
if(CreateThread(NULL,0,threadFunc,NULL,0,&threadID)==NULL)
{
m_bRunFlag=FALSE;
break;
}
else
{
nCount++;
}
}
//不斷創建線程,直到再不能創建為止
m_nCount=nCount;
UpdateData(FALSE);
Sleep(5000);
//延時5秒,等待所有創建的線程結束
GetDlgItem(IDC_TEST)->EnableWindow(TRUE);
m_bRunFlag=TRUE;
}
五、MFC對多線程編程的支持
MFC中有兩類線程,分別稱之為工作者線程和用戶界面線程。二者的主要區別在於工作者線程沒有消息循環,而用戶界面線程有自己的消息

隊列和消息循環。
工作者線程沒有消息機制,通常用來執行後台計算和維護任務,如冗長的計算過程,列印機的後台列印等。用戶界面線程一般用於處理獨

立於其他線程執行之外的用戶輸入,響應用戶及系統所產生的事件和消息等。但對於Win32的API編程而言,這兩種線程是沒有區別的,它們都

只需線程的啟動地址即可啟動線程來執行任務。
在MFC中,一般用全局函數AfxBeginThread()來創建並初始化一個線程的運行,該函數有兩種重載形式,分別用於創建工作者線程和用戶界

面線程。兩種重載函數原型和參數分別說明如下:

(1) CWinThread* AfxBeginThread(AFX_THREADPROC pfnThreadProc,
LPVOID pParam,
nPriority=THREAD_PRIORITY_NORMAL,
UINT nStackSize=0,
DWORD dwCreateFlags=0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL);
PfnThreadProc:指向工作者線程的執行函數的指針,線程函數原型必須聲明如下: UINT ExecutingFunction(LPVOID
pParam);
請注意,ExecutingFunction()應返回一個UINT類型的值,用以指明該函數結束的原因。一般情況下,返回0表明執行成功。
pParam:傳遞給線程函數的一個32位參數,執行函數將用某種方式解釋該值。它可以是數值,或是指向一個結構的指針,甚至可以被忽略;
nPriority:線程的優先順序。如果為0,則線程與其父線程具有相同的優先順序;
nStackSize:線程為自己分配堆棧的大小,其單位為位元組。如果nStackSize被設為0,則線程的堆棧被設置成與父線程堆棧相同大小;
dwCreateFlags:如果為0,則線程在創建後立刻開始執行。如果為CREATE_SUSPEND,則線程在創建後立刻被掛起;
lpSecurityAttrs:線程的安全屬性指針,一般為NULL;
(2) CWinThread* AfxBeginThread(CRuntimeClass* pThreadClass,
int nPriority=THREAD_PRIORITY_NORMAL,
UINT nStackSize=0,
DWORD dwCreateFlags=0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL);

pThreadClass 是指向 CWinThread
的一個導出類的運行時類對象的指針,該導出類定義了被創建的用戶界面線程的啟動、退出等;其它參數的意義同形式1。使用函數的這個原型

生成的線程也有消息機制,在以後的例子中我們將發現同主線程的機制幾乎一樣。
下面我們對CWinThread類的數據成員及常用函數進行簡要說明。
m_hThread:當前線程的句柄;
m_nThreadID:當前線程的ID;
m_pMainWnd:指向應用程序主窗口的指針
BOOL CWinThread::CreateThread(DWORD dwCreateFlags=0,
UINT nStackSize=0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL);
該函數中的dwCreateFlags、nStackSize、lpSecurityAttrs參數和API函數CreateThread中的對應參數有相同含義,該函數執行成功,返回

非0值,否則返回0。
一般情況下,調用AfxBeginThread()來一次性地創建並啟動一個線程,但是也可以通過兩步法來創建線程:首先創建CWinThread類的一個

對象,然後調用該對象的成員函數CreateThread()來啟動該線程。

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

使用InitInstance()。
virtual int CWinThread::ExitInstance();
在線程終結前重載該函數進行一些必要的清理工作。該函數返回線程的退出碼,0表示執行成功,非0值用來標識各種錯誤。同

InitInstance()成員函數一樣,該函數也只適用於用戶界面線程。
六、MFC多線程編程實例
在Visual C++
6.0編程環境中,我們既可以編寫C風格的32位Win32應用程序,也可以利用MFC類庫編寫C++風格的應用程序,二者各有其優缺點。基於Win32的

應用程序執行代碼小巧,運行效率高,但要求程序員編寫的代碼較多,且需要管理系統提供給程序的所有資源;而基於MFC類庫的應用程序可以

快速建立起應用程序,類庫為程序員提供了大量的封裝類,而且Developer
Studio為程序員提供了一些工具來管理用戶源程序,其缺點是類庫代碼很龐大。由於使用類庫所帶來的快速、簡捷和功能強大等優越性,因此

除非有特殊的需要,否則Visual
C++推薦使用MFC類庫進行程序開發。
我們知道,MFC中的線程分為兩種:用戶界面線程和工作者線程。我們將分別舉例說明。
用 MFC 類庫編程實現工作者線程

『玖』 自學《window程序設計》需要什麼基礎啊例如什麼基礎課程之類的!

1 0001 4423 馬克思主義哲學原理 3 哲學(0006) 一代三
2 0002 4424 DXP理論概論 3
3 0003 4425 法律基礎與思想道德修養 2
4 0012 4405 英語(一) 7 英語(一)
5 0022 4403 高等數學(工專) 7 高等數學(工專)
6 2198 4402 線性代數 3 線性代數
7 2314 4420 模擬電路與數字電路 6 電子線路與數字邏輯
2315 模擬電路與數字電路(實踐) 2
8 2316 4426 計算機應用技術 2 計算引論
2317 計算機應用技術(實踐) 3
9 2321 4411 匯編語言程序設計 3 匯編語言程序設計
2322 匯編語言程序設計(實踐) 1
10 0342 4412 高級語言程序設計 3 FORTRAN語言
0343 高級語言程序設計(實踐) 1
11 2142 4413 數據結構導論 4 數據結構
12 2318 4409 *計算機組成原理 4 計算機組成原理
13 2319 44121 *微型計算機及介面技術 2 微型計算機及應用
2320 *微型計算機及介面技術(實踐) 2
14 2323 4414 *操作系統概論 4 操作系統
15 2120 4415 *資料庫及應用 3 資料庫概論
2121 *資料庫及應用(實踐) 1
16 2141 4422 *計算機網路技術 4 電工電子學或普通物理
計算機操作技術或計算方法
17 4427 實踐考核:綜合實驗(10)

首 頁| 自考簡介 | 考試機構 | 考試計劃 | 考試動態 | 學習園地 | 政策查詢 | 自考期刊 | 教材信息 | 社考專欄 | 下載中心 | 自考論壇

本 科 專 業
專 科 專 業
開考體制改革試點專業
命題動態 自學考試
國家學歷文憑考試 非學歷證書考試
全國計算機等級考試 全國英語等級考試
NIT考試 全國少兒計算機考試
「兩學」考試 全國外語翻譯證書考試
劍橋辦公管理國際證書考試 劍橋少兒英語等級考試
劍橋英語五級證書考試 社會藝術水平考級
全國大學英語四、六級考試(CET) 中國市場營銷資格證書考試
學習方法
考試技巧
樣題選登
助學單位
有關政策與法規
自學考試暫行條例
自學考試有關規定
現行報考收費文件
福建省自學考試獎勵基金會
助學文件查詢
2005年《福建自學考試》
2004年《福建自學考試》
2003年《福建自學考試》
2002年《福建自學考試》
2001年《福建自學考試》
購買教材須知 自學考試教材
中英合作教材 全國公共英語等級考試(PETS)教材
全國計算機等級考試(NCRE)教材 全國計算機應用技術證書考試(NIT)教材
全國少兒計算機考試(少兒NIT)教材 兩學教育考試教材
全國外語翻譯證書考試(NAETI)教材 英語專業教材配套VCD、磁帶
2004年《活頁文叢》目錄 教材相關新聞
全國計算機等級考試(NCRE) 全國英語等級考試(PETS)
全國計算機應用技術證書考試(NIT) 全國外語翻譯證書考試(NAETI)
「兩學」考試 劍橋辦公管理國際證書考試
全國劍橋少兒英語等級考試 劍橋英語五級證書考試
社會藝術水平考級 全國少兒計算機考試
全國大學英語四、六級考試(CET) 中國市場營銷資格證書考試
全國高等學校英語應用能力考試
相關文檔
全省自考工作會暨表彰大會材料
考務考籍相關軟體
自學考試基金會表格

你的位置:首頁>>考試計劃>>開考體制改革試點專業

計算機軟體專業(本科)考試計劃

--------------------------------------------------------------------------------

來源:福建自考辦
2006-02-23

高等教育自學考試計算機軟體專業(本科)考試計劃

專業代碼:080718(基礎科段)、080719(本科段)

主考學校:福建農林大學

一.指導思想

高等教育自學考試是我國高等教育基本制度之一,是以高等教育學歷考試為主的國家考試,是個人自學、社會助學、國家考試相結合的高等教育形式,是我國高等教育體系的重要組成部分。

高等教育自學考試計算機軟體專業(本科)是為滿足軟體產業迅速發展需要而設置的;同時,根據高等教育自學考試的特點,具有較強的針對性和實用性,注重考核應考者對本專業的基本理論、基礎知識和基本技能的掌握程度以及運用所學知識分析和解決問題的能力。

二.學歷層次和規格

本專業分專科和本科兩種學歷,在總體上與全日制普通高校相近專業同等學歷的水平相一致。

本專業考試計劃為銜接式計劃,整個計劃分為基礎科段和本科段兩個既相對獨立又互相銜接的階段,依據不同層次考生採取不同的培養模式,形成多模式的應用型軟體人才培養體系。凡通過本計劃基礎科段規定的15門課程考試,成績合格,並通過相應課程的實踐考核,累計達到80學分,思想品德經鑒定符合要求者,發給專科畢業證書。凡繼續參加本計劃本科段規定的12門課程考試,成績合格,並通過相應課程的實踐考核,完成畢業設計並合格,思想品德經鑒定符合要求者,發給本科畢業證書。

凡獲得本科畢業證書,其學業水平達到了國家規定的學位標准,按照《中華人民共和國高等教育法》第二十二條和《中華人民共和國學位條例》的規定,由主考學校授予學士學位。

三.專業培養目標和基本要求

高等教育自學考試計算機軟體專業(本科)培養德、智、體全面發展的,具有堅實的計算機實際應用技能與方法,具有良好的科學素質、創新精神、實踐能力和國際競爭能力、適應國內外軟體產業市場需求的國際型、通用型、實用型的軟體高級專門人才。本專業要求應考者努力學習馬克思列寧主義、毛澤東思想、鄧小平理論,樹立愛國主義、集體主義和社會主義思想,遵守法律、法規,具有良好的思想品德。要求掌握計算機科學方面的基本理論與方法,掌握計算機軟體主流技術、軟體開發方法與軟體工程、軟體項目工程組織與管理;有良好的外語運用技能。可以攻讀計算機科學和相近學科的有關研究方向碩士學位。

四.考試課程與學分

(1)基礎科段(C080718)

序號
課程代碼
課程名稱
學分

1*
0001
馬克思主義哲學原理
3

2*
0002
鄧小平理論概論
3

3*
0003
法律基礎與思想道德修養
2

4*
0011
大學語文(本)
6

5*
0023
高等數學(工本)
10

6*
0015
英語(二)
14

7*
2198
線性代數
3

8*
2316
計算機應用技術
2

2317
計算機應用技術(實踐)
3

9*
0342
高級語言程序設計(一)
3

0343
高級語言程序設計(一)(實踐)
1

10
7011
數字邏輯電路
5

7012
數字邏輯電路(實踐)
2

11*
2318
計算機組成原理
4

12
7013
演算法與數據結構
4

7014
演算法與數據結構(實踐)
1

13*
2326
操作系統
4

2327
操作系統(實踐)
1

14*
2336
資料庫原理
4

2337
資料庫原理(實踐)
1

15*
0896
電子商務概論
4

0897
電子商務概論(實踐)
2

總學分

82

(2)本科段(C080719)

序號
課程代碼
課程名稱
學分
備注

1*
0004
毛澤東思想概論
2

2*
0005
馬克思主義政治經濟學原理
3

3*
2197
概率論與數理統計(二)
3

4
7015
計算機專業英語
6

5*
2324
離散數學
4

6*
2339
計算機網路與通信
6

7
7016
編譯原理
5

8*
2333
軟體工程
3

2334
軟體工程(實踐)
1

9*
3142
互聯網技術及應用
4

3143
互聯網技術及應用(實踐)
1

10
7017
面向網路編程技術
4

7018
面向網路編程技術(實踐)
1

11
7019
分布式資料庫
4

7020
分布式資料庫(實踐)
1

12
7021
軟體能力成熟度模型(CMM)
4
過程考核

6998
畢業設計

不計學分

總學分
52

1*
0023
高等數學(工本)
10









2
7013
演算法與數據結構
4

7014
演算法與數據結構(實踐)
1

3*
2326
操作系統
4

2327
操作系統(實踐)
1

4*
2318
計算機組成原理
4

5*
2336
資料庫原理
4

2337
資料庫原理(實踐)
1

說明:

1.序號後加「*」號為全國統考課程。

2.年齡在40歲以上的考生可申請免考英語(二),但必須加考三門課程,其學分不少於14學分。三門課程為:工程經濟(4學分)(課程代碼2194)、網路操作系統(5學分)(課程代碼2335)、區域網技術與組網工程(5學分)(課程代碼3141)。

3.為鼓勵考生參加國際國內認證,凡獲得SUN公司的JAVA認證可免考「面向網路編程技術」課程;凡獲得Oracle公司的Oracle認證,可免考「分布式資料庫」課程等。

4.報考本科段的條件

(1)學完本計劃基礎科段的考生可直接報考本專業本科段。

(2)計算機類各專業(非本專業基礎科段)專科畢業生報考本專業須加考1一門課程

(3)電工電子信息類非計算機類各專業專科及專科以上學歷層次的畢業生報考本專業,須加考1、2、3三門課程。

(4)理工類非電工電子信息類專業專科及專科以上學歷層次的畢業生報考本專業,須加考1、2、3、4四門課程。

(5)非理工科類各專業專科及專科以上學歷層次的畢業生報考本專業,須加考1、2、3、4、5五門課程。

五.課程說明和自學教材

1.馬克思主義哲學原理(課程說明略)

自學教材:《馬克思主義哲學原理》趙家祥編,經濟科學出版社

2.鄧小平理論概論(課程說明略)

自學教材:《鄧小平理論概論》錢淦榮編,中國財政經濟出版社

3.法律基礎與思想道德修養(課程說明略)

自學教材:《法律基礎與思想道德修養》,鞏獻田編,高等教育出版社

4.毛澤東思想概論(課程說明略)

自學教材:《毛澤東思想概論》羅正楷主編,武漢大學出版社

5.馬克思主義政治經濟學原理(課程說明略)

自學教材:《馬克思主義政治經濟學原理》衛興華主編,武漢大學出版社

6.大學語文(本)

本課程為本專業的一門公共課,是為了提高自學應考者語言文化素養和公共文化基礎知識而設置的公共課程。內容包括範文選讀以及與之相關的語言知識和文學知識。

通過該課程的學習,旨在使應考者對一般文言文具有初步閱讀能力,對一般說明、議論、記敘文章具有較強的理解、分析能力,對文學藝術作品具有初步分析、鑒賞能力。該課程的考核應注重知識的初步應用能力。

自學教材:《大學語文》徐中玉主編,華東師范大學出版社

7.英語(二)

本課程為本專業的一門公共課。本課程的目的是使應考者掌握4000個單詞(含中學階段1600個單詞)、一定量的習語和系統的語法知識,具有較強的閱讀能力和一定的英譯漢能力以及初步的聽、說、寫和漢譯英的能力,使其能以英語為工具,獲取專業所需要的信息,並為進一步提高英語水平打下較好的基礎。

應考者在學完本課程後,應能藉助詞典獨立閱讀與後期課文難度相當的一般性資料,並能譯成漢語,理解基本正確,譯文基本通順。

自學教材:《大學英語自學教程》(上、下冊)高遠主編,高等教育出版社

8.高等數學(工本)

本課程為本專業的一門公共課。通過學習,要求應考者系統地獲得一元函數的微積分學、多元函數微積分學(包括向量代數與空間解析幾何)、常微分方程、級數的基本知識、理論和方法。要求應考者掌握各有關內容的基本概念、基本理論和基本方法,具有比較熟練地運用能力和分析能力、空間想像能力及抽象數學模型的初步能力,為學習後續課程和進一步擴大數學知識奠定必要的基礎。

自學教材:《高等數學》(上、下冊)陳慶樂主編,西安交通大學出版社

9.線性代數

本課程為本專業的一門公共課。其內容包括:行列式,矩陣及其運算,向量的線性相關矩陣,線性方程組、特徵值問題與實二次型。

通過本課程的學習,使應考者掌握行列式的定義,性質;熟練運用矩陣的運演算法則;熟練掌握線性方程組解的結構及其判別法則,掌握特徵值的重要概念。

自學教材:《工程數學(線性代數)》魏戰線主編,遼寧大學出版社

10.數字邏輯電路

本課程為本專業的一門主要專業基礎課。內容包括:數字電子技術概述、邏輯代數、集成邏輯門、組合邏輯電路、時序邏輯電路、存儲器、脈沖信號的產生和變換電路、數模和模數轉換器、中小規模的邏輯電路設計。

通過本課程的學習,使應考者掌握一些數字邏輯電路基本理論、概念、方法及應用,具有中小規模邏輯電路設計初步能力。

自學教材:《數字集成電路基礎》皇甫正賢編著,南京大學出版社

11.計算機應用技術

本課程為本專業的一門專業基礎課。內容包括:計算機應用基礎知識、DOS、WINDOWS操作系統簡介、中文WINDOW95/98操作系統的使用,漢字輸入/輸出方法綜述、字處理軟體WORD97與表格處理軟體EXCEL97、網路初步知識。

通過本課程學習,使應考者具有微機應用、文字編輯表格生成的能力。

自學教材:《計算機應用技術》張寧主編,經濟科學出版社

12.高級語言程序設計

本課程為本專業的主要一門專業基礎課之一。內容包括:C語言程序結構、基本數據類型和運算、各類語句、構造數據類型(數組結構、聯合、枚舉)和應用,指針、函數、編譯預處理、文件處理、C語言程序設計和調試。

通過本課程學習,使應考者掌握C語言及使用C語言編程的知識,具有用C語言描述、求解問題的基本能力。

自學教材:《高級語言程序設計》遲成文主編,經濟科學出版社

13.計算機組成原理

本課程為本專業的主要一門專業基礎課之一。內容包括:計算機系統的基本概念、運算組織、存儲器組織、導址技術和指令系統、整機結構、控制器的設計、輸入輸出和介面等。

通過本課程學習,使應考者掌握計算機基本組成結構及各部件的工作原理和邏輯實現。

自學教材:《計算機組成原理》胡越明主編,經濟科學出版社

14.演算法與數據結構

本課程為本專業的一門專業基礎課。課程內容有:演算法與數據結構的基本概念,包括演算法的時間、空間復雜性和抽象數據類型;基於序列的抽象數據類型表、棧、隊列、串;反映層次關系的抽象數據類型樹;在實際應用中常用的排序與選擇演算法;非線性結構圖及圖的演算法;表示集合的抽象數據類型,包括字典、優先隊列和並查集等。

通過本課程的學習,使應考者在掌握基礎知識的同時,加深理解「演算法」與「數據結構」的緊密關系,學會分析研究實際問題的特點,選擇適當的數據結構和存儲結構,設計有效的求解演算法;通過實踐訓練,強化學生運用基本數據結構進行復雜程序設計的訓練過程,提高利用計算機解決實際問題的實踐技能。

自學教材:《數據結構??用C語言描述》寧正元主編,水電出版社

15.資料庫原理

本課程為本專業的一門專業基礎課。本課程內容為:資料庫概論、關系數據模型、關系運算理論、SQL語言、關系資料庫的規范化,資料庫設計的全過程、資料庫的保護、資料庫管理系統的結構,以及分布式資料庫面向對象的資料庫等資料庫新技術的介紹。

通過本課程的學習,使應考者掌握資料庫的基本原理和技術,能應用現有資料庫管理系統,掌握資料庫設計和資料庫系統的開發方法。

自學教材:《資料庫原理》丁寶康主編,經濟科學出版社

16.操作系統

本課程為本專業的一門專業基礎課。課程內容為:操作系統的典型演算法和結構、作業管理、進程管理、存儲管理、設備管理、文件管理、操作系統結構設計以及UNIX操作系統介紹。

通過本課程的學習,使應考者掌握操作系統的基本結構、設計原理及實現方法,了解它與硬體和其它系統軟體的關系,能使用和分析常見的操作系統。

自學教材:《操作系統》譚耀明主編,中國人民大學出版社

17.概率論與數理統計

本課程為本專業的一門公共課。是研究隨機現象統計規律的一門數學課。本課程概率論部分包括:隨機事件及其概率、隨機變數、多維隨機變數和隨機變數的數字特徵等內容;數理統計部分包括抽樣分布、參數估計、假設檢驗、方差分析、回歸分析和正交試驗設計等內容。

通過本課程的學習,要求應考者理解概率論的基本概念,熟悉隨機事件及其概率的重要性質,熟悉隨機變數的常用分布,並會進行相應的計算。掌握數理統計中有關參數估計和假設檢驗的方法,了解方差分析、回歸分析和正交試驗設計。

自學教材:《工程數學(概率論與數理統計)》範金城主編,遼寧大學出版社

18.離散數學

本課程為本專業的一門專業基礎課。課程內容為:命題邏輯和一階謂詞邏輯的基本概念和基本演算;集合的概念和運算、二元關系和函數;代數運算和代數系統的基本性質、半群和群、隊和域、格和布爾代數;圖的基本概念、樹、歐拉圖和哈密頓圖、平面圖、圖著色、賦權圖、二部圖等。

通過本課程的學習,使應考者有抽象思維和邏輯推理能力,掌握計算機科學技術常用的離散數學中的概念、性質和運算。

自學教材:《離散數學》左孝凌等編,上海科技出版社

19.計算機專業英語

本課程為專業的一門專業基礎課。課程內容有:計算機專業詞彙,包括一般的單詞在計算機科學中的不同的意義,以及各種縮寫詞(操作系統、與計算機有關的組織、各種應用軟體、計算機的各種部件等);操作過程中出現「出錯信息」理解,以及對解決問題的解釋;通過查閱字典完成對一些英語版應用軟體中README、HELP文件的閱讀、理解,從而解決在將來的日常應用中使用英語版應用軟體的能力等。

通過本課程的學習,使應考者能熟練閱讀計算機外文資料,熟練理解操作過程中出現的「出錯信息」,提高計算機軟體編程能力。

自學教材:軟體工程英語 Philip Lew 孫偉 清華大學出版社

20.互聯網及其應用

本課程為本專業的一門應用性和實踐性都很強的專業課。課程內容包括:Internet和Intranet的概念和基本原理、連接方式和介面、IP地址、上網步驟、網路服務、E-Mail、WWW及其主頁、電子新聞、遠程登錄查詢、DNS域名服務、BBS電子布告、應用工具等。

自學教材:《互聯網及其應用》袁寶宗主編,吉林大學出版社

21.電子商務概論

本課程為本專業的一門專業課。課程內容有:電子商務的基本知識及電子商務所涉及的相關問題,並了解目前國內外企業對這些問題的人認識與解決方式;客戶關系管理(CRM);供應鏈管理(SCM);財務實時處理(STP);網路整合(WI);合作與兼並;知識管理(KM);企業資源策劃(ERP)和企業電子商務戰略管理與風險管理。

通過課程的學習,使應考者掌握電子商務的基本知識,著重培養如何進行電子商務、如何進行企業的電子規劃等。通過課程教學,應著重培養學生具備以下兩方面的良好素質。一是針對現有電子商務系統設計與開發中出現的復雜問題,善於綜合運用所學基本理論和知識對具體問題提出解決的方案;二是培養網路經濟時代企業經理人的電子商務的基本素質。

自學教材:《電子商務學概論》陳國龍等編著,廈門大學出版社

22.軟體工程

本課程為本專業的一門專業課。課程內容包括:軟體工程的基本概念、可行性研究與計劃、需求分析和規格說明方法、設計方法、編程方法、檢驗和測試方法、維護方法,面向對象的軟體開發方法、軟體工具和環境等。

通過本課程的學習,使應考者掌握軟體工程和有關概念和和各階段的主要技術、方法與工具、具備組織和從事軟體開發的基本能力。

自學教材:《軟體工程》陸麗娜編,經濟科學出版社

23.計算機網路與通信

本課程為本專業的一門專業基礎課。課程內容:數據通信技術、包括數據傳輸原理、通信交換技術、通信規程、差錯控制等;計算機網路體系結構、QSI中的物理層、數據鏈路層、網路層、傳輸層及高層協議;計算機區域網、網路互連、網際網路的實用技術與應用等。

通過本課程的學習,使應考者了解簡化的ISO/OSI參考模型,掌握計算機網路基本原理和概念,熟悉計算機網路典型技術與協議,具備適應網路發展的能力。

自學教材:《計算機網路與通信》馮博琴主編,經濟科學出版社

24.面向網路編程技術

本課程為本專業的一門專業課。課程內容有:Java語言基本特點、主要內容和結構,抽象窗口工具箱的概念,半編譯和虛擬機的概念及應用;一般Java開發環境的工作方式;Java applet的開發和設計方法;Java語言的語法規定、數據類型和面向對象的程序設計方式,Symmantec Java 圖形界面設計方式和 V J++的常用控制項;Java介面和包的概念、構造和使用包的方法,異常拋出機制、異常處理機制;Java的輸入輸出方式,網路環境編程、網址的處理、統一資源定位器(URL)的概念和TCP/IP Socket的實現。

通過本課程的學習,培養應考者掌握運用Java先進的語言機制、構造問題的模型建立解決問題方案的能力。培養應考者運用面向對象程序設計、多線程程序設計、applet設計及網路環境編程的能力。通過課程的學習,主要提高應考者以下兩方面的素質,其一,學會從系統的角度分析問題,建立問題解決方案;其二,理解跨平台語言的本質和機理,理解Java虛擬機的機制。

自學教材:《Java與面向對象程序設計教程》李金銘編著,清華大學出版社

25.編譯原理

本課程為本專業的一門專業課。課程內容有:有限自動機和形式語言理論的基本概念;語法分析各種技術;語義生成和優化技術;自動生成工具的使用方法。

通過課程的學習,培養應考者抽象思維和邏輯推理能力;培養應考者利用自動機理論和形式語言理論解決實際問題的能力;具備應用編譯技術和方法構造編譯系統和其它應用軟體的能力。通過課程學習,將使應考者在以下方面得到鍛煉和提高:1)對程序設計語言使用將有更深入的認識和了解;2)在抽象思維和形式推理的能力方面得到良好的鍛煉。

自學教材:《編譯原理》康慕寧編著,西北工大出版社

26.分布式資料庫

本課程為本專業的一門專業課。課程內容有:分布式資料庫基本概念;分布式資料庫系統體系結構;數據分布;分布式查詢處理;分布式事務管理;分布式並發控制與恢復;分布式完整性與安全性,以及以oracle為示例,展開對分布式資料庫原理和開發的介紹。

隨著用戶對資料庫應用需求的不斷發展,資料庫技術經歷了如下的幾個變遷:從集中式→分布式,從C/S→B/S,從關系資料庫→面向對象資料庫,等等。資料庫技術面臨著前所未有的挑戰和機遇。在眾多的資料庫新技術中,分布式資料庫系統是研究得比較透徹、技術上比較成熟的一門計算機前沿學科。因此,僅僅學習和掌握《資料庫系統原理》,對計算機本科生在今後實際工作中開展資料庫新技術的研究,是遠遠不夠的。因此,必須通過本課程的學習,使學生掌握分布式資料庫系統的基本原理、基本概念,並初步具備分布式資料庫應用系統的開發經驗,才能培養出的計算機應用(特別是資料庫應用)高級專業人才在計算機應用領域中處於先進行列。

自學教材:自編,出版社待定

參考教材:《分布式資料庫》鄭振楣等編著,科學出版社

《Oracle 9i中文版基礎教程》張曜等編著,清華大學出版社

27.軟體能力成熟度模型(CMM)

本課程為本專業的一門專業課。課程內容有:CMM的基本概念,總體框架;各個成熟度等級相關的關鍵過程的目標和關鍵實踐;國際上有關軟體成熟度模型的新進展,重點介紹集成的能力成熟度模型CMMI;個體軟體過程PSP;軟體過程評估方法的比較。

軟體能力成熟度模型被國際軟體界公認為是軟體工程學的一項重大成果。通過課程的學習,培養應考者科學地評價軟體開發單位的軟體能力成熟度等級,幫助軟體開發單位進行自檢,了解自已的強項和弱項,從而不斷完善單位的軟體開發過程,確保軟體質量,提高軟體開發效率。

自學教材:《軟體能力成熟度模型》何新貴等編著,清華大學出版社
另外,團IDC網上有許多產品團購,便宜有口碑

閱讀全文

與window多線程編程相關的資料

熱點內容
伺服器旁為什麼要有電腦 瀏覽:522
什麼樣的app上買機票最便宜 瀏覽:987
安卓如何查看異常重啟 瀏覽:717
解壓音樂排名 瀏覽:386
安卓手機瀏覽器怎麼掃二維碼 瀏覽:720
通達信成本均線源碼 瀏覽:619
可以下載的解壓音頻 瀏覽:567
海賊王怎麼換伺服器 瀏覽:321
計算機上的共享文件夾映射 瀏覽:943
榮耀安裝包在文件夾哪裡 瀏覽:198
機票php源碼 瀏覽:235
linux共享mac 瀏覽:926
中國沒有國外的伺服器地址 瀏覽:761
為什麼退款伺服器連接錯誤 瀏覽:559
android簡訊存儲位置 瀏覽:977
unix網路編程卷4 瀏覽:808
找靚機app下單什麼時候發貨 瀏覽:413
android一個應用兩個進程 瀏覽:803
linux硬碟復制 瀏覽:808
php圖片伺服器搭建 瀏覽:801