MFC中创建和使用线程的方法
有關(guān)創(chuàng)建線程的問題有三種方法:
1.C語言函數(shù),調(diào)用_beginthread();
2.API函數(shù),調(diào)用CreateThread();
3.MFC函數(shù),調(diào)用AfxBeginThread();
推薦使用MFC函數(shù)AfxBeginThread();
利用MFC里的AfxBeginThread函數(shù)能很方便地創(chuàng)建線程以及對(duì)線程進(jìn)行等待、喚醒等操作。
1、函數(shù)原型
CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc , LPVOID pParam , int nPriority = THREAD_PRIORITY_NORMAL , UINT nStackSize = 0 , DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);
2、參數(shù)說明
(1)返回值:一個(gè)指向新線程的線程對(duì)象。
(2)pfnThreadProc:線程的入口函數(shù),聲明一定要如下:UINT MyThreadFunction( LPVOID pParam );
(3)pParam:傳遞入線程的參數(shù),注意它的類型為:LPVOID,所以我們可以傳遞一個(gè)結(jié)構(gòu)體入線程。
(4)nPriority:線程的優(yōu)先級(jí),一般設(shè)置為 0。讓它和主線程具有共同的優(yōu)先級(jí)。
(5)nStackSize:指定新創(chuàng)建的線程的棧的大小。如果為 0,新創(chuàng)建的線程具有和主線程一樣的大小的棧。
(6)dwCreateFlags:指定創(chuàng)建線程以后,線程有怎么樣的標(biāo)志。可以指定兩個(gè)值:
<1>CREATE_SUSPENDED:線程創(chuàng)建以后,會(huì)處于掛起狀態(tài),直到調(diào)用ResumeThread;<2>0:創(chuàng)建線程后就開始運(yùn)行。- 1
- 2
- 3
(7)lpSecurityAttrs:指向一個(gè) SECURITY_ATTRIBUTES 的結(jié)構(gòu)體,用它來標(biāo)志新創(chuàng)建線程的安全性。如果為 NULL,那么新創(chuàng)建的線程就具有和主線程一樣的安全性。
3、線程創(chuàng)建
一般創(chuàng)建過程如下:
先定義一個(gè)工作函數(shù),一般來說你的線程就是依照該函數(shù)的功能執(zhí)行任務(wù):
UINT MyThreadFunction( LPVOID pParam )
{
//函數(shù)體return 0;- 1
- 2
- 3
}
然后可以按以下方式創(chuàng)建線程:
CWinThread* MyThread=AfxBeginThread(MyThreadFunction , pParam , THREAD_PRIORITY_NORMAL , 0 , 0 , NULL);
4、線程的等待與喚醒
(1)讓線程等待(暫時(shí)掛起):
MyThread->SuspendThread();
(2)喚醒暫停的線程:
MyThread->ResumeThread();
5、查看線程狀態(tài):
DWORD code;
GetExitCodeThread(MyThread->m_hThread , &code);
if(code==STILL_ACTIVE){//線程仍在執(zhí)行}
else {//線程停止執(zhí)行}
6、結(jié)束線程
TerminateThread(MyThread->m_hThread , 0);
?
、、、、、、、、、、、
轉(zhuǎn)自:http://blog.csdn.net/richerg85/article/details/7438314
多線程的簡介
線程---操作系統(tǒng)調(diào)度的最小單位。線程包含在進(jìn)程中,是進(jìn)程中實(shí)際運(yùn)行的單位。一個(gè)進(jìn)程中可以同時(shí)運(yùn)行多個(gè)線程,每個(gè)線程可以執(zhí)行不同的任務(wù),這就是所謂的多線程。同一進(jìn)程中的多個(gè)線程將共享該進(jìn)程中的全部系統(tǒng)資源,如虛擬地址空間、文件描述符和信號(hào)處理等,但是同一個(gè)進(jìn)程中的多個(gè)線程都有各自的調(diào)用棧、寄存器環(huán)境和線程本地存儲(chǔ)。
?????? 對(duì)于單核(單CPU)系統(tǒng)來說,即便處理器一次只能運(yùn)行一個(gè)線程,但是操作系統(tǒng)通過時(shí)間片輪轉(zhuǎn)技術(shù),在不同的線程之間進(jìn)行切換,讓用戶產(chǎn)生可以同時(shí)處理多個(gè)任務(wù)的錯(cuò)覺,這樣的程序運(yùn)行機(jī)制稱為軟件的多線程。
?????? 對(duì)于多核(多個(gè)CPU)系統(tǒng)來說,這樣的系統(tǒng)能同時(shí)進(jìn)行真正的多線程多任務(wù)處理。這種運(yùn)行機(jī)制可以稱為硬件的多線程技術(shù)。
?????? 多線程程序作為一種多任務(wù)、并發(fā)的工作方式,當(dāng)然有以下的優(yōu)點(diǎn):
1) 提高應(yīng)用程序響應(yīng)。這對(duì)圖形界面的程序尤其有意義,當(dāng)一個(gè)操作耗時(shí)很長時(shí),整個(gè)系統(tǒng)都會(huì)等待這個(gè)操作,此時(shí)程序不會(huì)響應(yīng)鍵盤、鼠標(biāo)、菜單的操作,而使用多線程技術(shù),將耗時(shí)長的操作(time consuming)置于一個(gè)新的線程,可以避免這種尷尬的情況。
2) 使多CPU系統(tǒng)更加有效。操作系統(tǒng)會(huì)保證當(dāng)線程數(shù)不大于CPU數(shù)目時(shí),不同的線程運(yùn)行于不同的CPU上。
3) 改善程序結(jié)構(gòu)。一個(gè)既長又復(fù)雜的進(jìn)程可以考慮分為多個(gè)線程,成為幾個(gè)獨(dú)立或半獨(dú)立的運(yùn)行部分,這樣的程序會(huì)利于理解和修改。
多線程編程實(shí)例1
???????說明:本系列所有的實(shí)例都是在vc6.0下實(shí)現(xiàn)的,并且都是基于MFC AppWizard[exe]工程創(chuàng)建的“Dialog based”應(yīng)用程序。
???????實(shí)例1,簡單的多線程,實(shí)現(xiàn)動(dòng)態(tài)顯示時(shí)間
工程名稱為Mthread1,首先在Mthread1Dlg.h中聲明線程函數(shù)---void ThreadProc(),此函數(shù)為全局函數(shù)。
?????? 部分代碼如下:
// Mthread1Dlg.h : header file //... ...void ThreadProc();//線程函數(shù)聲明 class CMthread1Dlg : public CDialog {... ... protected:HICON m_hIcon;HANDLE hThread;//線程句柄... ...DECLARE_MESSAGE_MAP() };MthreadDlg.cpp
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | // Mthread1Dlg.cpp : implementation file // ? / // CAboutDlg dialog used for App About volatile BOOL m_bRun;//代表線程是否正常運(yùn)行 ? void ThreadProc() //線程函數(shù) { ????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); ????} } class CAboutDlg : public CDialog { ???...? ... void CMthread1Dlg::OnStart()?? { ????// TODO: Add your control notification handler code here ????hThread = CreateThread( ?????????????????NULL,?????????????????????????????????? // SD ?????????????????0,????????????????????????????????? // initial stack size ????????????????(LPTHREAD_START_ROUTINE)ThreadProc,??? // thread function ????????????????NULL,??????????????????????????????????? // thread argument ????????????????0,?????????????????????????????????? // creation option ?????????????????&threadID?????????????????????????????? // thread identifier ????????????????); ????GetDlgItem(IDC_START)->EnableWindow(FALSE); ????GetDlgItem(IDC_STOP)->EnableWindow(TRUE); }?? ? void CMthread1Dlg::OnStop() { ????// TODO: Add your control notification handler code here ????m_bRun = FALSE; ????GetDlgItem(IDC_START)->EnableWindow(TRUE); ????GetDlgItem(IDC_STOP)->EnableWindow(FALSE); } |
執(zhí)行結(jié)果:
總結(jié)
以上是生活随笔為你收集整理的MFC中创建和使用线程的方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: x264_param_t结构体参数分析
- 下一篇: 从程序员角度看ELF