MFC第三节-多线程

一、程序,进程,线程

程序是指令的集合,以文件形式储存在磁盘上。一个程序可以对应多个进程,一个进程代表一个实例。

进程由管理进程的内核对象、地址空间组成。内核对象存放关于进程的统计信息,地址空间包含可执行模块、DLL模块和堆、栈。进程不执行任何东西,它是线程的容器,每个进程至少有一个线程。当创建一个进程时,操作系统自动创建一个线程—主线程。每个进程有4GB的地址空间,进程之间相互独立。

线程由线程的内核对象和线程栈组成。线程只有一个内核对象和栈,只有很少的内存。同一个进程的线程能共享进程的数据。

二、创建新线程

HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, //安全性结构
DWORD dwStackSize,//初始栈大小
LPTHREAD_START_ROUTINE lpStartAddress,//新线程函数入口地址
LPVOID lpParameter,//参数
DWORD dwCreationFlags,//CREATE_SUSPENDED或0
LPDWORD lpThreadID//线程ID
);

注:用Sleep(……)可以使线程暂停自己的运行

三、创建互斥对象

互斥对象包括一个线程ID,一个计数器,一个使用数量。

可以创建匿名互斥对象、命名互斥对象。

HANDLE CreateMutex(……)

BOOL ReleaseMutex(HANDLE hMutex)

DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMillionseconds);

注:线程同步:可用匿名互斥对象

保证只有一个实例运行:命名互斥对象。(问题:进程之间相互独立,为什么可以用互斥对象?)

四、MFC中加载套接字库

BOOL AfxSocketInit(WSADATA *lpwsaData=NULL)

对MFC程序,第一个要包含的头文件就是<stdafx.h>

五、在MFC中,线程函数不能是普通的成员函数。"如果要调用线程函数来启动某个线程的话,应该不需要产生某个对象就可以调用"。因此可以把它设置为类的静态成员函数。

如:

static DWORD WINAPI RecvProc(LPVOID lpParameter);

注意:在不能使用全局函数和全局变量时,可以采用静态成员函数和静态成员变量。它们不输入类的对象,而是类本身。

六、MFC的消息映射机制

一个MFC消息响应函数在程序中有三处相关信息:

1. 函数原型(h文件) afx_msg void OnLButtonDown(UINT nFlags, CPoint point);

2. 函数实现(c文件)void OnLButtonDown(UINT nFlags, CPoint point);

3. 用来关联消息和消息相应函数的宏 ON_WM_LBUTTONDOWN(XX,XX)

七、自定义消息

向消息队列加入消息:::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)tempBuf)

定义消息的值:#define WM_RECVDATA WM_USER+1;

在程序的三处中加相应语句。

MFC第三节-多线程

时间: 2024-08-28 11:07:18

MFC第三节-多线程的相关文章

转:MFC中创建多线程

MFC中创建多线程 MFC的多线程函数必须声明为静态的或者是全局函数(不同的在于全局函数不能访问类的私有静态成员,而静态类函数可以):但这样的线程函数只能访问静态的成员变量,要实现访问类的其他成员,可以这样实现: 1)全局函数.如   UINT   MyThread(LPVOID   p) 2)类的静态成员函数.如   static   UINT   MyView::MyThread(LPVOID   p) 线程函数是可以带参数的,比如  static __stdcall  workthread

MFC笔记之多线程聊天室

新手刚接触,跟着孙鑫老师视频一步一步的做.从VC6.0到VS2010好像并不是那么顺利,下面记录下一点收获. 网络编程的一般步骤: 1声明套接字版本(WSAStartup);2创建套接字(socket);3绑定套接字(bind);4发送接收(sendto/recvfrom);5关闭(closesocket) 第1~3步代码如下: 1 CString error; 2 WORD wver; 3 wver=MAKEWORD(1,1); 4 WSAData data; 5 if(0!=WSAStart

MFC UI按钮多线程

单线程操作UI会使窗口假死,所以UI操作需要用到多线程 实现效果:当点击kiss时按钮闪动3次 原理:自定义一个消息(WM_CHANGE_BUTTON),当点击按钮"kiss"时,启动一个新的线程,线程每隔0.5s钟发送一次WM_CHANGE_BUTTON消息.程序监听到该消息时调用消息函数,改变按钮大小. 1.在界面上添加一个按钮修改ID为 IDC_KISS 2.ctrl+shift+x,创建类向导中的消息机制 3.定义事件函数 #define WM_CHANGE_BUTTON WM

转:MFC创建多线程实例

作者:http://blog.csdn.net/wangningyu/article/details/4404134 平时在MFC里使用多线程时其实是很方面的,因为微软提供了一个API让我们很方面的去创建线程:下面是MSDN中关于CreateThread的函数原型: 1.函数原型声明: [cpp] view plain copy print? CreateThread The CreateThread function creates a thread to execute within the

[MFC美化] MFC使用SkinMagic详解-1

[SkinMagic使用流程] 1.工程配置SkinMagic相关文件 2.初始化SkinMagic皮肤文件,窗体加载皮肤 3.释放皮肤资源 1.工程配置SkinMagic相关文件 在给窗体或对话框加载皮肤的时候首先要把使用SkinMagic所用到的相关Dll..h文件.Lib包含到工程目录下: SkinMagicLib.h :放到工程的根目录   SkinMagic.lib :放到工程的根目录或者放到其他目录,后者需要工程添加现有项,添加进资源文件 SkinMagic.dll :放到debug

【MFC】MFC技巧学习 当做字典来查

MFC技巧学习 摘自:http://www.cnblogs.com/leven20061001/archive/2012/10/17/2728023.html 1."属性页的添加:创建对话框的类,该类要从CpropertyPage继承: 然后在要添加该对话框为属性页的类(头文件)里创建CpropertySheet类的一个对象m_tabsheet和新创建的对话框类的对象m_skatch: 最后,在.cpp文件里的OnInitDialog()之类的函数里实现如下代码: { m_tabsheet.Cr

VC2010常见问题的解决方案

vc++里面的obj文件是什么文件Project(项目)中每个cpp经编译成为obj(object)目标文件,所有obj文件和资源文件经链接(link)成为可执行文件,obj文件可称为目标文件或中间文件.另外,obj文件只给出了程序的相对地址,而EXE是绝对地址.那是程序被编译后产生的二进制文件,不能打开,你想执行程序的话直接打开对应程序的.exe文件就可以了,也可以打开.cpp文件重新编译一下运行,但二进制文件时不能打开的,即使打开了也是乱码. 报错分析与纠正:error C3872: "0x

CSDN回帖得分大全(近两年)

CSDN回帖得分大全(近两年) √ vs2005调用dll的时候Initialize()函数返回错误[VC/MFC 基础类] √ 为什么我创建登陆框之后,然后获取登陆框的数据时候总是出现非法操作![VC/MFC 界面] √ CFileFind::FindFile   支持通配符么?[VC/MFC 基础类] √ vc++   浮动窗口联动的实现[VC/MFC 界面] √ VC   从数据库中读出数据流后怎么判断文件格式[VC/MFC 数据库] √ windows   7接硬體,不會自動刷新   請

LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main

在创建MFC项目时,如果没有设置好项目参数, 就会在编译时产生很多连接错误, 如我今天遇到的: LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main 解决方法: 控制台项目要使用windows子系统, 而不是console, 设置:[Project] --> [Settings] --> 选择"Link"属性页,在Project Options中将/subsystem:console改成/