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 |
|
执行结果:
MFC中创建和使用线程的方法相关推荐
- java中创建两种线程的方式_java中创建线程的两种方式有什么区别?
*** 一.创建线程 1.继承Thread类 定义类继承Thread, 重写run()方法, 将线程中要执行的代码写在run()方法中 创建该类对象, 调用start()方法就可以开启一条新线程, 新 ...
- 在MFC中创建动态控件的生成与响应
在MFC中创建动态控件的生成与响应 2008-10-22 作者:风林 网友评论 1 条 点击进入论坛 动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建 ...
- 转:MFC中创建多线程
MFC中创建多线程 MFC的多线程函数必须声明为静态的或者是全局函数(不同的在于全局函数不能访问类的私有静态成员,而静态类函数可以):但这样的线程函数只能访问静态的成员变量,要实现访问类的其他成员,可 ...
- Java中创建数组的几种方法
Java中创建数组的几种方法 public static void main(String[] args) { //创建数组的第一种方法 int[] arr=new int[6]; int intVa ...
- vscode设置templates_在VScode中创建你的代码模板的方法
使用VScode的用户代码片段功能,来生成自己习惯的代码模板,提升开发效率 1.选择菜单里的 文件 > 首选项 > 用户代码片段 2.选择你需要自定义模板的文件,以vue为例 3. 配置对 ...
- python 空矩阵_在NumPy中创建空数组/矩阵的方法
如何在NumPy中创建空数组/矩阵? 在添加行的情况下,你最好的选择是创建一个与数据集最终一样大的数组,然后向它添加数据 row-by-row: >>> import numpy & ...
- linux如何生成tar文件内容,在Linux系统中创建tar.gz文件的方法及实例讲解
本文介绍在Linux系统中创建tar.gz文件的方法,及实例讲解. 介绍 tar存档是一个文件,用于存储其他文件的集合,包括有关它们的信息,例如所有权.权限和时间戳. 在Linux操作系统中,可以使用 ...
- JNI中创建新的线程回调java方法的技巧
在实际项目中,经常需要在Native层创建新的线程处理一些耗时操作,然后将结果回调给java层.如果按照普通的方式,直接获取MethodID,然后新线程中调用CallxxxMethod(),这样肯定是 ...
- Delphi 如何解决在DLL的入口函数中创建或结束线程时卡死
先看一下使用Delphi开发DLL时如何使用MAIN函数, 通常情况下并不会使用到DLL的MAIN函数,因为delphi的框架已经把Main函数隐藏起来 而工程函数的 begin end 默认就是M ...
最新文章
- JAVA面向对象的特征
- 大学计算机基础python学多久_怎么自学python,大概要多久?
- RocketMQ-初体验RocketMQ(05)_RocketMQ架构解读
- php中ip授权系统,PHP授权验证系统(域名+IP双重验证一键更新授权系统)
- java中集合的结构(list和map)
- 知乎高赞:从源码层,拆解OracleJDK和OpenJDK有什么区别?网友:不愧是大神的回答~...
- 解决使用MinGW编译C++代码报cannot find -lxxxx的问题
- linux调用ocx插件_Wordpress file manager插件任意文件上传
- Canvas简单动画和像素处理
- linux ssh 查看vg,linux SSH证书登录
- mysql主从复制原理的理解,MySQL主从复制以及原理好理解)
- C#自定义数字格式字符串
- “深度学习”是人工智能的一场革命吗?
- python图像拼接_图像拼接_图像拼接算法_python图像拼接 - 云+社区 - 腾讯云
- 国内镜像加速器registry的制作
- 【数据库】聊一下数据库的锁机制
- STM32F103高级定时器死区时间的计算
- react使用二级(多级)路由(rout)实现局部跳转
- 荣耀最强拍照手机诞生:荣耀20系列塑造的“潮流科技宇宙”
- python进阶_基础篇4(数据类型和列表)
热门文章
- java kmp算法_KMP算法java版实现
- 计算机应用基础专科,2019年自考《计算机应用基础》专科模拟试题及答案
- 以太坊在哪里买_DeFi只是以太坊的开胃小菜,以太坊2.0才是重头戏
- 条令考试小程序辅助器_应知应会条令纲要学习微课堂(六)
- python全排列_全排列算法python实现
- mpi tcp连接报错_关于WinCC与真实PLC之间的TCP/IP连接问题-工业支持中心-西门子中国...
- python内核_python内核_python内核语言_python版本内核 - 云+社区 - 腾讯云
- biginteger 原理_Java Bigdecimal使用原理详解
- 你还会写这段C51程序吗?
- HDLBits答案(5)_Generate实例化模块