b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

基于MFC的多线程编程技术

电脑杂谈  发布时间:2020-06-10 12:06:54  来源:网络整理

mfc创建线程例子_mfc创建ui线程_mfc多线程编程实例

基于MFC的多线程编程技术杨立峰(河南省平顶山市平顶山工业学院,平顶山467001)要: 本文重点介绍在Visual C ++ 6.0中使用MFC类库进行的多线程开发编程技术,以及该技术示例的使用,以分析多线程编程中线程间通信和同步对象的典型用法. 关键词: 多线程; MFC;同步对象线程之间的通信CLC编号: TP3文件标识代码: AAbstact: 本文着重介绍了使用MFC在Visual C ++ +6.0中进行多线程开发的程序技术,并分析了与之对应的同步对象的模型用法. 该示例利用多线程程序中的线程. 关键词: 多线程; MFC;同步对象现代中线程的对应关系在各种实时监视系统和通信系统中,如果用户的应用程序需要同时处理多个任务,那么多线程是理想的选择.

例如,如果网络文件服务功能的应用程序采用单线程编程方法,则需要循环检查网络连接和磁盘驱动器的状态,并在适当的时间显示这些数据. 您必须等待查询以刷新数据. 显示. 对于用户而言,延迟可能会很长. 在应用多线程的情况下,这些任务可以分为多个线程. 一个线程负责检查网络,另一个线程管理磁盘驱动器,另一个线程负责显示数据. 这三个线程结合起来可以完成文件服务和使用. 访问者还可以及时查看网络中的变化. 多线程的应用范围非常广泛,尤其是在当前的桌面平台上,该系统的许(如网络(Internet),打印,文字处理,图形图像,和文件管理)都在一个系统上运行,这更需要我们的应用程序. 程序可以同时处理多个事件,而这些正是多线程可以实现的. 1多线程的基本概念Windows 9X / NT是抢占式多任务操作系统mfc多线程编程实例,程序的CPU占用时间由系统确定. 多任务意味着系统可以同时运行多个进程,并且每个进程可以同时执行多个线程. 进程是应用程序的运行实例,具有自己的地址空间. 每个进程都有一个主线程,并且可以同时建立其他线程. 线程是操作系统分配CPU时间的基本实体. 每个线程占用的CPU时间由系统分配,并且系统不断程之间切换.

mfc多线程编程实例_mfc创建ui线程_mfc创建线程例子

进程中的线程共享进程的虚拟地址空间,并且可以在并行执行状态下访问进程的资源. 2 MFC多线程编程方法2.1创建线程在VC ++ 6.0下,MFC应用程序的线程由CWinThread对象表示. VC ++将线程分为两种类型: 用户界面线程和工作线程. 用户界面线程可以提供界面和用户交互,通常用于处理用户输入并响应各种事件和消息. 工作线程主要用于处理程序的后台任务. 程序通常不需要直接创建CWinThread对象. 通过调用AfxBeginThread()函数,将自动创建一个CWinThread对象以启动进程. 这两个线程都是使用此函数创建的. 工作线程的创建包括: 实现控制功能和启动工作线程. 控制函数的原型: UINT ThreadProc(LPVOID lpParameter);类型和参数必须匹配mfc多线程编程实例,函数名称是任意的. 2.2启动线程启动工作线程原型: CWinThread * AfxBeginThread(CRuntimeClass * pThreadClass,int nPriority,UINT nStackSize,DWORD dwCreateFlags,LPSECURITY_ATTRIBUTES lpSecurityAttrs);参数pThreadClass指定线程的运行类,该函数返回线程对象.

12.3线程的终止线程的终止取决于下列事件之一: 线程函数返回;否则,线程终止. 线程调用ExitThread()退出;在异常情况下,线程句柄称为TerminateThread()退出;线程所属的进程终止. 3使用同步对象所有活动线程共享进程资源. 因此,在编程时,您需要考虑多个线程访问同一资源时发生冲突的问题: 当一个线程在访问过程对象时,另一个线程想要更​​改该对象,这可能会产生错误的结果. 因此,程序员在编程时必须解决此冲突. MFC为我们提供了几个同步对象C ++类,即CSyncObject,CMutex,CSemaphore,CEvent,CCriticalSection. 在编程中,VC ++提供的同步对象用于协调多个线程的并行性. 常用的有以下几种: CSemaphore: 信号量对象,它允许一定数量的线程访问共享资源,并且通常用于控制访问共享资源的线程数. Cmutex: 互斥对象. 一次最多允许一个线程访问某个资源. 当它不被占用时,它处于信号状态,可以实现对共享资源的互斥访问. CEvent: 事件对象,用于使线程将事件通知其他线程,因此它也可以用于阻止对资源的访问,直到线程释放资源以使其变为已发出信号的状态为止.

mfc创建线程例子_mfc创建ui线程_mfc多线程编程实例

适用于线程等待事件发生的情况. CCriticalSection: 关键部分对象,将一段代码放入关键部分,并且最多只允许一个线程执行这一段代码. 关键部分仅在创建过程中有效. 常规处理步骤为: 创建CSingleLock或CMultiLock对象,然后调用其Lock函数. 对象结束时,将在析构函数中自动调用Unlock函数. 当然,您也可以在任意位置调用解锁功能. 4.多线程编程示例的分析上面介绍了Visual C ++ 6.0中多线程编程的技术要点. 为了充分说明此技术,让我们分析Visual C ++提供的多线程示例,并讨论线程间. 通信和同步对象的典型用法. 读者可以运行这些示例来获得多线程操作的直观效果. 4.1 MyThread示例MyThread的功能是在一个窗口中创建多个活动的时差时钟. 用户可以激活下一个时钟或终止激活的时钟. 用户可以通过菜单选择启用或禁用时钟. 4.1.1创建多线程MyThread项目,以基于单个文档创建应用程序. 在应用程序的“ ID_MAINFRAME”中添加菜单“线程”,并在该菜单下添加菜单项“启动线程”和“停止线程”.

4.1.2编写程序代码以添加消息响应功能并编辑代码: void CMyThreadView :: OnStartThread(){// TODO: 在此处添加命令处理程序代码ThreadFlag = 1; HWND hWnd = GetSafeHwnd(); AfxBeginThread(ThreadProc,hWnd);} void CMyThreadView :: OnStopThread(){// TODO: 在此处添加命令处理程序代码2ThreadFlag = 0; ///将线程标记为已终止}编辑全局线程控制函数ThreadProc()UINT ThreadProc( LPVOID param){int i = 0;双r = 35.0; double alpha = 3.14 / 30.0; //一次运动中手旋转的弧度数int cx,cy; //手的中心//最多可启动8个线程if(ThreadCount> = 8){MessageBeep((WORD)-1); return 0;} //确定每只手的中心坐标cx = 50 +(线程计数%4)* 120; if(ThreadCount <4)cy = 60;否则cy = 200; ThreadCount ++; //线程数增加1 CClientDC dc((((CFrameWnd *)(AfxGetApp()-> m_pMainWnd))-> GetActiveView()); //第二次绘制开始dc.SetROP2(R2_NOT); dc.MoveTo(cx,cy); dc.LineTo(int(cx + r * cos(i * alpha)),int(cy + r * sin(i * alpha))); //为(;;)绘制的直线//无限循环,使秒针连续旋转{//监视全局变量ThreadFlag,如果该值为零,则结束线程if(ThreadFlag == 0)break; dc.LineTo(cx,cy); //删除上一条二手直线; //画一条二手直线dc.LineTo(int(cx + r * cos(i * alpha)),int(cy + r * sin(i * alpha))); i ++; if(i == 60)i = 0; :: Sleep(500); //延迟500 us} //发送消息WM_THREADENDED :: PostMessage((HWND)param,WM_THREADENDED,0,0); // Add语句返回0;} // ThreadProc的结尾编译并连接MyThread程序并执行菜单“启动线程”以不断旋转的秒针创建时钟.

mfc创建线程例子_mfc多线程编程实例_mfc创建ui线程

4.1.3线程之间的通信通常需要线程之间的通信. 例如,要使用其他线程终止线程,必须程之间设置通信方法. 线程之间的两种通信方式: 使用全局变量和使用自定义消息. 全局变量的使用需要在MyThreadView.cpp中定义的标头中定义: volatile int ThreadFlag;同时,将语句ThreadFlag = 1添加到void CMyThreadView :: OnStartThread();中. 修改线程控制函数ThreadProc()以监视全局变量ThreadFlag. 如果该值为零,则线程结束. 编译并连接MyThread程序,然后执行菜单“ Stop Thread”以停止时钟. 使用自定义消息通过发送消息程之间进行通信. 您只需要自定义用户消息,就可以通过向子3个线程中的主线程发送消息来完成线程之间的通信. 4.2 MYSyn MYSyn实例的功能是增加并打印计数器的值,说明同步对象的用法. 4.2.1使用临界区(临界区)的线程同步使用临界区对象的线程同步可轻松确保只有一个线程同时访问同一数据对象. 该方法是: 在MFC应用程序中创建关键部分对象: CCriticalSectioncritical;当应用程序访问需要保护的数据时,只需在访问完成后调用关键部分对象的成员函数Lock()critical.Lock(),即可调用Unlock()来释放线程对关键部分的控制.

关键. Unlock()的特定操作如下: 创建多线程MySyn项目: 基于单个文档创建应用程序. 在应用程序的“ ID_MAINFRAME”中添加菜单“线程”,并在此菜单下添加菜单项“同步”. 编写程序代码: 添加消息响应功能并编辑代码. 需要在MyThreadView.cpp的标头中定义#include“ afxmt.h” int count = 0; CCriticalSection严重;编辑同步线程控制功能以实现线程同步. UINT syncfunction(LPVOID param)//同步线程控制功能{int Data [5],i; critical.Lock(); //保护(i = 0; i <3; i ++){count ++; ::睡眠(50); Data [i] = count;} char str [50]; str [0] = 0; for(i = 0; i <3; i ++){int len = strlen(str); wsprintf(&str [len],“%d”,Data [i]);} critical.Unlock(); //将此线程的控制权释放到关键部分: : MessageBox((HWND)param,str,“ synchro Thread”,MB_OK); return 0;} void CMysnView :: OnSynchro()//同步启动三个线程{// TODO: 在此处添加命令处理程序代码count = 0; HWND hWnd = GetSafeHwnd(); AfxBeginThread(synchrofunction,hWnd); AfxBeginThread(synchrofunction,hWnd); AfxBeginThread(synchrofunction,hWnd); 4}编译并连接MySny程序,执行菜单“ Synchronize”,结果如下图1所示: 图1显然,在将关键部分用于线程同步之后,3每个线程打印的计数器的值均匀递增,表明这三个线程不会交替接管控制,确保只有一个线程同时访问数据对象计数.

mfc创建ui线程_mfc多线程编程实例_mfc创建线程例子

4.2.2使用互斥对象的线程同步互斥对象与关键区域对象相似,但比关键区域对象复杂. 它不仅允许同一程序的不同线程安全地共享资源,而且还允许不同应用程序的线程安全地共享资源. 互斥锁只能由一个线程拥有. 如果另一个线程已占用该互斥锁,则系统将暂停当前的调用线程,直到释放该互斥锁占用的线程,并且等待线程被阻塞为止. 唤醒并控制互斥对象. 由同一应用程序的不同线程安全共享资源的方法类似于关键部分对象. 4.2.3使用信号量对象进行线程同步关键节对象和互斥对象只能一次允许一个线程访问资源,而信号量对象可以允许多个线程同时访问资源. 创建信号量对象时,可以设置访问计数器的值以控制同时使用资源的线程数. 每当线程访问资源时,访问计数器的值都会减一. 当访问计数器的值为0时,将不再允许其他线程访问资源,直到某个线程释放了信号量为止. (这将使访问计数器增加1). 使用语句CSemaphore * sema = new CSemaphore(2,2);创建一个信号量对象. 其中两个参数代表初始线程数和最大线程数. 可以对上面的示例程序中的线程控制功能进行类似的更改,以使用Semaphore对象实现线程同步.

5结束语多线程编程是Win32的一个重要方面,与Win16不同. 它的编程技术是相对较新的. 要设计一个性能良好的多线程程序,不仅需要清楚操作系统的处理过程,而且还需要特定的应用程序. 有一个全面的了解,并且非常清楚应用程序中各个线程部分之间的关​​系. 同步模块中同步对象的具体含义应尽可能清楚,以利于控制程序中的同步事件并避免死锁. 或现象无法同步处理. 参考文献: [1]王明福,于苏宁,Visual C ++编程,北京: 高等教育出版社,2004 [2]郝文华,王浩强,Windows多线程编程技术和示例,北京: 曹华伟,中国水利水电出版社, 2005作者简介: 杨立峰(1968),男,讲师,华中科技大学信息管理,主要从事网络和软件工程等教学工作. 作者单位: 平顶山工业职业技术学院计算机系5


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-240570-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 吴德鹏
        吴德鹏

        美国的军事力量是强大

      • 雷萍
        雷萍

        另一方面要通过实际行动向美国表达坚决的意志

      热点图片
      拼命载入中...