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

本文详细介绍了在MFC中如何使用AfxBeginThread函数创建线程,包括线程的创建、参数说明、线程状态的控制以及线程的结束。并提供了一个简单的多线程编程实例,展示了如何动态显示时间。通过创建线程,可以提高应用程序响应,特别是在多任务处理中,多线程技术能够提升用户体验和系统效率。
摘要由CSDN通过智能技术生成

有关创建线程的问题有三种方法:
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. <1>CREATE_SUSPENDED:线程创建以后,会处于挂起状态,直到调用ResumeThread;
  2. <2>0:创建线程后就开始运行。
  • 1
  • 2
  • 3

(7)lpSecurityAttrs:指向一个 SECURITY_ATTRIBUTES 的结构体,用它来标志新创建线程的安全性。如果为 NULL,那么新创建的线程就具有和主线程一样的安全性。

3、线程创建

一般创建过程如下:

先定义一个工作函数,一般来说你的线程就是依照该函数的功能执行任务:

UINT MyThreadFunction( LPVOID pParam )

{


   
   
  1. //函数体
  2. 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);

}

  执行结果:

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值