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…

0 0
原创粉丝点击