MFC 以及多线程初探
来源:互联网 发布:移动网络机顶盒价格表 编辑:程序博客网 时间:2024/05/01 22:29
这两天接到任务说要用VC写个多线程,以前基本没有写过MFC的我当时的表情是这样的:
然后我去lib借了两坨书,开始写。
(决心分隔线)
基本准备:
1. 怕自己智商捉急,随手的东西还是要记一下,VS快捷键调整,知识的传送门:
http://jingyan.baidu.com/article/9158e0006e10d8a254122826.html
代码补全快捷键修改key words搜索“编辑.完成单词”(翻译不吐槽)。
2. 主题深色,字体Consolas,字号12。
MFC编程基础:
1. 微软基础类库(英语:Microsoft Foundation Classes,简称MFC)是一个微软公司提供的类库(class libraries),以C++类的形式封装了Windows API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。
2. 标准C中有很多特性是没有的,在Windows上实现UI,多线程之类的依赖于OS的特性就需要不同的和平台相关的API,Win32 API就是一类封装了种种特性的Windows平台C库。所有基于Windows窗体的程序都被称为Win32程序。但实际上Win32编写比较复杂,因此MFC诞生。MFC又是Microsoft对于Win32的封装,因为Win32写起来还是比较麻烦的。
3. 线程同步是指多个线程在协调的情况下保持正确的先后执行顺序,同步不是同时,否则出现程序执行的不可再现性。
4. HANDLE类型是句柄,相当于一个结构体指针,指向含义丰富的一块占有资源的部分。
5. MFC当中线程分为UI线程和工作者线程,工作者线程不需要界面也没有消息队列,但是UI线程两者都有。
6. 在非MFC程序当中使用MFC函数,需要在项目中勾选共享库MFC支持,仅仅使用Windows标准库支持是不行的。
7. 空宏定义加强了程序的可读性,另外为了使得程序在不同的字符集下都能够编译通过,使用_t的宏定义保存为Unicode字符编码格式,关于这个有一篇很好的文章,传送门:
http://www.cnblogs.com/ini_always/archive/2011/05/20/2050517.html
MFC多线程基础:
任务:我们接下来以一个输出“Hello World”的程序来说明线程的执行情况,假设我们有两个线程叫做Hello和World,分别向控制台打印10次自己所代表的单词。
首先我们来看一下直接在主线程main里面运行两个打印线程的执行效果,如下图所示:
MFC实现多线程有以下三种方式:
(1) 临界区
(2) 事件
(3) 信号量
临界区声明了一个临界区变量对临界区资源进行加锁操作。实现代码如下:
/* Author:Mr.Bubbles 多线程同步示例程序——临界区 Emai:jackwhitexr@sina.com*/#include "afxmt.h"#include <afxwin.h>#include <cstdio>#define N 100using namespace std;//输出Hello字符串的线程DWORD WINAPI Hello(LPVOID IpParameter){ for(int i=0;i<10;i++){ printf("Hello\n"); Sleep(10); } return 0; }//输出World字符串的线程DWORD WINAPI World(LPVOID IpParameter){ for (int i = 0; i<10; i++){ printf("World\n"); Sleep(10); } return 0; }int main(){ //创建并启动两个线程 CreateThread(NULL, 0, Hello, 0, 0, 0); CreateThread(NULL, 0, World, 0, 0, 0); Sleep(1000); //防止主线程运行过快 CloseHandle(Hello); CloseHandle(World); return 0;}
运行效果如下图所示:
事件是一种类似于临界区的东西,是一种对象,它有有信号和无信号两种状态,有信号状态的时候线程才可以进行争夺,无信号状态时候争夺的线程全部阻塞。代码如下,看代码理解:
/* Author:Mr.Bubbles 多线程同步示例程序——事件对象 Emai:jackwhitexr@sina.com*/#include "afxmt.h"#include <afxwin.h>#include <cstdio>#define N 100using namespace std;HANDLE g_event; //使用事件对象进行同步DWORD WINAPI Hello(LPVOID IpParameter){ WaitForSingleObject(g_event,INFINITE); for(int i=0;i<10;i++){ printf("Hello\n"); } SetEvent(g_event); return 0;}//输出World字符串的线程DWORD WINAPI World(LPVOID IpParameter){ WaitForSingleObject(g_event, INFINITE); for (int i = 0; i<10; i++){ printf("World\n"); } SetEvent(g_event); return 0;}int main(){ //创建并启动两个线程 g_event = CreateEvent(NULL, false, false, NULL); //事件实例 SetEvent(g_event); CreateThread(NULL, 0, Hello, 0, 0, 0); CreateThread(NULL, 0, World, 0, 0, 0); Sleep(1000); //防止主线程运行过快 CloseHandle(Hello); CloseHandle(World); CloseHandle(g_event);return 0;}
效果运行我就不贴咯,最后的信号量机制等有机会再实现下。
(任务完成分隔线)
完成任务我的心情是这样的。
很多问题和描述肯定不准确,希望大家指正,今后会继续努力。
To be continued…
- MFC 以及多线程初探
- MFC星火01_多线程初探
- MFC初探
- 初探MFC
- 多线程初探
- 多线程(Windows API 以及 MFC支持的多线程)
- 【多线程】初探多线程
- 多线程MFC
- MFC 多线程
- MFC多线程
- MFC多线程
- MFC多线程
- MFC多线程
- mfc多线程
- MFC多线程
- MFC多线程
- MFC多线程
- MFC 多线程
- 【EJB学习笔记】——远程调用和本地调用
- linux shell将字符串分割数组
- RotateAnimation类:旋转变化动画类,自定义控件通过rotateAnimation实现特效
- hibernate configration 双向关联
- 2015-电气-李杰
- MFC 以及多线程初探
- Google 2016 面试题2 | 不构造树的情况下验证先序遍历
- android动态加载jar包
- APP接口设计安全问题
- VB作业
- 记录---ORACLE 中的 ROW_NUMBER() OVER() 分析函数的用法
- 整理何凯明去雾算法代码优化
- 使用 Docker 搭建 Java Web 运行环境
- Google 2016 面试题 | 数组补丁