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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

有關創建線程的問題有三種方法:
1.C語言函數,調用_beginthread();
2.API函數,調用CreateThread();
3.MFC函數,調用AfxBeginThread();
推薦使用MFC函數AfxBeginThread();

利用MFC里的AfxBeginThread函數能很方便地創建線程以及對線程進行等待、喚醒等操作。

1、函數原型

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

2、參數說明

(1)返回值:一個指向新線程的線程對象。

(2)pfnThreadProc:線程的入口函數,聲明一定要如下:UINT MyThreadFunction( LPVOID pParam );

(3)pParam:傳遞入線程的參數,注意它的類型為:LPVOID,所以我們可以傳遞一個結構體入線程。

(4)nPriority:線程的優先級,一般設置為 0。讓它和主線程具有共同的優先級。

(5)nStackSize:指定新創建的線程的棧的大小。如果為 0,新創建的線程具有和主線程一樣的大小的棧。

(6)dwCreateFlags:指定創建線程以后,線程有怎么樣的標志。可以指定兩個值:

<1>CREATE_SUSPENDED:線程創建以后,會處于掛起狀態,直到調用ResumeThread;<2>0:創建線程后就開始運行。
  • 1
  • 2
  • 3

(7)lpSecurityAttrs:指向一個 SECURITY_ATTRIBUTES 的結構體,用它來標志新創建線程的安全性。如果為 NULL,那么新創建的線程就具有和主線程一樣的安全性。

3、線程創建

一般創建過程如下:

先定義一個工作函數,一般來說你的線程就是依照該函數的功能執行任務:

UINT MyThreadFunction( LPVOID pParam )

{

//函數體return 0;
  • 1
  • 2
  • 3

}

然后可以按以下方式創建線程:

CWinThread* MyThread=AfxBeginThread(MyThreadFunction , pParam , THREAD_PRIORITY_NORMAL , 0 , 0 , NULL);

4、線程的等待與喚醒

(1)讓線程等待(暫時掛起):

MyThread->SuspendThread();

(2)喚醒暫停的線程:

MyThread->ResumeThread();

5、查看線程狀態:

DWORD code;

GetExitCodeThread(MyThread->m_hThread , &code);

if(code==STILL_ACTIVE){//線程仍在執行}

else {//線程停止執行}

6、結束線程

TerminateThread(MyThread->m_hThread , 0);

?

、、、、、、、、、、、

轉自:http://blog.csdn.net/richerg85/article/details/7438314

多線程的簡介

線程---操作系統調度的最小單位。線程包含在進程中,是進程中實際運行的單位。一個進程中可以同時運行多個線程,每個線程可以執行不同的任務,這就是所謂的多線程。同一進程中的多個線程將共享該進程中的全部系統資源,如虛擬地址空間、文件描述符和信號處理等,但是同一個進程中的多個線程都有各自的調用棧、寄存器環境和線程本地存儲。

?????? 對于單核(單CPU)系統來說,即便處理器一次只能運行一個線程,但是操作系統通過時間片輪轉技術,在不同的線程之間進行切換,讓用戶產生可以同時處理多個任務的錯覺,這樣的程序運行機制稱為軟件的多線程。

?????? 對于多核(多個CPU)系統來說,這樣的系統能同時進行真正的多線程多任務處理。這種運行機制可以稱為硬件的多線程技術。

?????? 多線程程序作為一種多任務、并發的工作方式,當然有以下的優點:
  1) 提高應用程序響應。這對圖形界面的程序尤其有意義,當一個操作耗時很長時,整個系統都會等待這個操作,此時程序不會響應鍵盤、鼠標、菜單的操作,而使用多線程技術,將耗時長的操作(time consuming)置于一個新的線程,可以避免這種尷尬的情況。
  2) 使多CPU系統更加有效。操作系統會保證當線程數不大于CPU數目時,不同的線程運行于不同的CPU上。
  3) 改善程序結構。一個既長又復雜的進程可以考慮分為多個線程,成為幾個獨立或半獨立的運行部分,這樣的程序會利于理解和修改。

多線程編程實例1

???????說明:本系列所有的實例都是在vc6.0下實現的,并且都是基于MFC AppWizard[exe]工程創建的“Dialog based”應用程序。

???????實例1,簡單的多線程,實現動態顯示時間

工程名稱為Mthread1,首先在Mthread1Dlg.h中聲明線程函數---void ThreadProc(),此函數為全局函數。

?????? 部分代碼如下:

// Mthread1Dlg.h : header file //... ...void ThreadProc();//線程函數聲明 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;//代表線程是否正常運行

?

void ThreadProc() //線程函數

{

????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);

}

  執行結果:

總結

以上是生活随笔為你收集整理的MFC中创建和使用线程的方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。