有关创建线程的问题有三种方法:
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中创建和使用线程的方法相关推荐

  1. java中创建两种线程的方式_java中创建线程的两种方式有什么区别?

    *** 一.创建线程 1.继承Thread类 定义类继承Thread, 重写run()方法, 将线程中要执行的代码写在run()方法中 创建该类对象, 调用start()方法就可以开启一条新线程, 新 ...

  2. 在MFC中创建动态控件的生成与响应

    在MFC中创建动态控件的生成与响应 2008-10-22 作者:风林 网友评论 1 条 点击进入论坛 动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建 ...

  3. 转:MFC中创建多线程

    MFC中创建多线程 MFC的多线程函数必须声明为静态的或者是全局函数(不同的在于全局函数不能访问类的私有静态成员,而静态类函数可以):但这样的线程函数只能访问静态的成员变量,要实现访问类的其他成员,可 ...

  4. Java中创建数组的几种方法

    Java中创建数组的几种方法 public static void main(String[] args) { //创建数组的第一种方法 int[] arr=new int[6]; int intVa ...

  5. vscode设置templates_在VScode中创建你的代码模板的方法

    使用VScode的用户代码片段功能,来生成自己习惯的代码模板,提升开发效率 1.选择菜单里的 文件 > 首选项 > 用户代码片段 2.选择你需要自定义模板的文件,以vue为例 3. 配置对 ...

  6. python 空矩阵_在NumPy中创建空数组/矩阵的方法

    如何在NumPy中创建空数组/矩阵? 在添加行的情况下,你最好的选择是创建一个与数据集最终一样大的数组,然后向它添加数据 row-by-row: >>> import numpy & ...

  7. linux如何生成tar文件内容,在Linux系统中创建tar.gz文件的方法及实例讲解

    本文介绍在Linux系统中创建tar.gz文件的方法,及实例讲解. 介绍 tar存档是一个文件,用于存储其他文件的集合,包括有关它们的信息,例如所有权.权限和时间戳. 在Linux操作系统中,可以使用 ...

  8. JNI中创建新的线程回调java方法的技巧

    在实际项目中,经常需要在Native层创建新的线程处理一些耗时操作,然后将结果回调给java层.如果按照普通的方式,直接获取MethodID,然后新线程中调用CallxxxMethod(),这样肯定是 ...

  9. Delphi 如何解决在DLL的入口函数中创建或结束线程时卡死

    先看一下使用Delphi开发DLL时如何使用MAIN函数, 通常情况下并不会使用到DLL的MAIN函数,因为delphi的框架已经把Main函数隐藏起来 而工程函数的 begin  end 默认就是M ...

最新文章

  1. JAVA面向对象的特征
  2. 大学计算机基础python学多久_怎么自学python,大概要多久?
  3. RocketMQ-初体验RocketMQ(05)_RocketMQ架构解读
  4. php中ip授权系统,PHP授权验证系统(域名+IP双重验证一键更新授权系统)
  5. java中集合的结构(list和map)
  6. 知乎高赞:从源码层,拆解OracleJDK和OpenJDK有什么区别?网友:不愧是大神的回答~...
  7. 解决使用MinGW编译C++代码报cannot find -lxxxx的问题
  8. linux调用ocx插件_Wordpress file manager插件任意文件上传
  9. Canvas简单动画和像素处理
  10. linux ssh 查看vg,linux SSH证书登录
  11. mysql主从复制原理的理解,MySQL主从复制以及原理好理解)
  12. C#自定义数字格式字符串
  13. “深度学习”是人工智能的一场革命吗?
  14. python图像拼接_图像拼接_图像拼接算法_python图像拼接 - 云+社区 - 腾讯云
  15. 国内镜像加速器registry的制作
  16. 【数据库】聊一下数据库的锁机制
  17. STM32F103高级定时器死区时间的计算
  18. react使用二级(多级)路由(rout)实现局部跳转
  19. 荣耀最强拍照手机诞生:荣耀20系列塑造的“潮流科技宇宙”
  20. python进阶_基础篇4(数据类型和列表)

热门文章

  1. java kmp算法_KMP算法java版实现
  2. 计算机应用基础专科,2019年自考《计算机应用基础》专科模拟试题及答案
  3. 以太坊在哪里买_DeFi只是以太坊的开胃小菜,以太坊2.0才是重头戏
  4. 条令考试小程序辅助器_应知应会条令纲要学习微课堂(六)
  5. python全排列_全排列算法python实现
  6. mpi tcp连接报错_关于WinCC与真实PLC之间的TCP/IP连接问题-工业支持中心-西门子中国...
  7. python内核_python内核_python内核语言_python版本内核 - 云+社区 - 腾讯云
  8. biginteger 原理_Java Bigdecimal使用原理详解
  9. 你还会写这段C51程序吗?
  10. HDLBits答案(5)_Generate实例化模块