日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

MFC中创建和使用线程的方法

發(fā)布時(shí)間:2023/12/18 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MFC中创建和使用线程的方法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

有關(guān)創(chuàng)建線程的問題有三種方法:
1.C語(yǔ)言函數(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ù)說(shuō)明

(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)體,用它來(lái)標(biāo)志新創(chuàng)建線程的安全性。如果為 NULL,那么新創(chuàng)建的線程就具有和主線程一樣的安全性。

3、線程創(chuàng)建

一般創(chuàng)建過程如下:

先定義一個(gè)工作函數(shù),一般來(lái)說(shuō)你的線程就是依照該函數(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

多線程的簡(jiǎn)介

線程---操作系統(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)來(lái)說(shuō),即便處理器一次只能運(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)來(lái)說(shuō),這樣的系統(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í)很長(zhǎng)時(shí),整個(gè)系統(tǒng)都會(huì)等待這個(gè)操作,此時(shí)程序不會(huì)響應(yīng)鍵盤、鼠標(biāo)、菜單的操作,而使用多線程技術(shù),將耗時(shí)長(zhǎng)的操作(time consuming)置于一個(gè)新的線程,可以避免這種尷尬的情況。
  2) 使多CPU系統(tǒng)更加有效。操作系統(tǒng)會(huì)保證當(dāng)線程數(shù)不大于CPU數(shù)目時(shí),不同的線程運(yùn)行于不同的CPU上。
  3) 改善程序結(jié)構(gòu)。一個(gè)既長(zhǎng)又復(fù)雜的進(jìn)程可以考慮分為多個(gè)線程,成為幾個(gè)獨(dú)立或半獨(dú)立的運(yùn)行部分,這樣的程序會(huì)利于理解和修改。

多線程編程實(shí)例1

???????說(shuō)明:本系列所有的實(shí)例都是在vc6.0下實(shí)現(xiàn)的,并且都是基于MFC AppWizard[exe]工程創(chuàng)建的“Dialog based”應(yīng)用程序。

???????實(shí)例1,簡(jiǎn)單的多線程,實(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中创建和使用线程的方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。