精华内容
下载资源
问答
  • MFC线程和同步

    2016-02-18 10:38:43
    1 MFC线程分类  1.1 工作者线程 - 在后台执行,不需要用户界面  1.2 用户线程 - 提供了用户界面,可以与用户交互  2 MFC线程相关  2.1 线程创建和结束 AfxBeginThread - 创建线程 AfxEndThread - 结束...

        1 MFC线程分类

            1.1 工作者线程 - 在后台执行,不需要用户界面
            1.2 用户线程 - 提供了用户界面,可以与用户交互


        2 MFC线程相关

            2.1 线程创建和结束
    AfxBeginThread - 创建线程
    AfxEndThread - 结束线程
            2.2 CWinThread类 - 线程类,父类是CCmdTarget
            2.3 同步类
    CCriticalSection - 临界区
    CEvent - 事件
    CMutex - 互斥量
    CSemaphone - 信号量
    父类都是CSyncObject类,都是通过Lock/Unlock函数等候/释放同步操作


        3 工作者线程的使用

            3.1 线程函数的定义

    线程函数原型
    UINT ThreadProc (LPVOID pVoid)

            3.2 线程的创建

    CWinThread* AfxBeginThread(
          AFX_THREADPROC pfnThreadProc,
    LPVOID pParam,
    int nPriority = THREAD_PRIORITY_NORMAL,
    UINT nStackSize = 0,
    DWORD dwCreateFlags = 0,
    LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
    );
    pfnThreadProc - 线程处理函数
    pParam - 线程参数
    nPriority - 线程优先级别,使用默认值
    nStackSize - 线程堆栈,0使用缺省
    dwCreateFlags - 创建标识,0创建后立即执行
    lpSecurityAttrs  - 安全属性
    返回值CWinThread指针,封装了线程处理的一些函数


        4 用户线程的使用

            4.1 定义线程类

    基于CWinThread派生子类

            4.2 在线程类中添加窗口

    在子类Initinstance中创建并显示窗口,并将窗口指定为线程主窗口

            4.3 创建线程

    AfxBeginThread()创建线程
    CWinThread* AfxBeginThread(
          CRuntimeClass* pThreadClass,   
         int nPriority = THREAD_PRIORITY_NORMAL,
         UINT nStackSize = 0,
         DWORD dwCreateFlags = 0,
         LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
        );
    pThreadClass - CWinThread派生子类的运行时类信息

            4.4 与工作者线程的对比

    4.4.1 在现象上可以添加用户界面

    4.4.2 在线程内部,增加自己的消息循环机制


    工作者线程示例代码

    // WorkThread.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include "WorkThread.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    using namespace std;
    
    //线程函数
    UINT AFX_CDECL ThreadProc(LPVOID)
    {
    	while (1)
    	{
    		printf("WorkThread------\n");
    		Sleep(1000);
    	}
    	
    	return 0;
    }
    
    int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
    {
    	int nRetCode = 0;
    	//创建线程
    	CWinThread* pThread;
    	pThread = AfxBeginThread(ThreadProc,NULL);
    
    	system("pause");
    	//结束线程
    	TerminateThread(pThread->m_hThread, 0);
    	
    	return nRetCode;
    }
    

    用户线程示例代码

    定义自己的线程类,继承CWinThread

    #pragma once
    
    #include "TestDlg.h"
    
    // CMyThread
    
    class CMyThread : public CWinThread
    {
    	DECLARE_DYNCREATE(CMyThread)
    
    protected:
    	CMyThread();           // 动态创建所使用的受保护的构造函数
    	virtual ~CMyThread();
    
    public:
    	virtual BOOL InitInstance();
    	virtual int ExitInstance();
    
    protected:
    	DECLARE_MESSAGE_MAP()
    };
    


     在线程类中添加窗口

    在子类Initinstance中创建并显示窗口,并将窗口指定为线程主窗口

    BOOL CMyThread::InitInstance()
    {
    	// TODO: 在此执行任意逐线程初始化
    	CTestDlg dlg;
    	m_pMainWnd = &dlg;
    	dlg.DoModal();
    	return TRUE;
    }

    创建线程


    //创建用户线程
    	CMyThread* myThread = (CMyThread*)AfxBeginThread(RUNTIME_CLASS(CMyThread));



































    展开全文
  • MFC线程同步

    千次阅读 2017-01-01 11:31:22
    MFC线程同步 *为什么要进行线程同步? 线程是非常好的程序设计方法,线程可以简化程序设计,而且线程也极大的改善了程序性能,但是 ,使用线程要小心,比如多个线程同时使用了共享资源,如果多个线程同时修改了...

    MFC线程同步
    *为什么要进行线程同步?
    线程是非常好的程序设计方法,线程可以简化程序设计,而且线程也极大的改善了程序性能,但是 ,使用线程要小心,比如多个线程同时使用了共享资源,如果多个线程同时修改了共享资源,那么 最后的结果很可能是错的,要保证共享资源不被多个资源同时修改,就要把多个线程进行同步,同步就是禁止多个线程对共享资源同时进行修改,一次只允许一个线程对共享资源进行操作

       做一个简单的例子,创建一个MFC应用程序,
    

    这里写图片描述
    对应的两个按钮分别创建一个线程,如图
    这里写图片描述
    转到定义的线程函数
    这里写图片描述
    这里写图片描述
    这两个线程都是执行相同的操作,即将total加100000000次,之所以加这么多次,是因为计算机运行速度太快,次数少了看不出来效果,按下button1,得到的total就是100000000,然后按下button2,total又加了100000000,所以就是200000000,是没问题的,
    这里写图片描述
    这里写图片描述
    但是要是按下button1然后讯速按下button2(即在线程A结束之前按下,如果循环次数过少,还来不及按就已经结束了)呢?
    这里写图片描述
    很明显会发生错误

    展开全文
  • 在一个循环体内结束线程 CWinThread * DpsThread; DpsThread = AfxBeginThread(Thread, this); if (WAIT_OBJECT_0 == WaitForSingleObject(DpsThread->m_hThread, INFINITE)) { return 0;}

    在一个循环体内结束线程

    CWinThread * DpsThread;
    DpsThread = AfxBeginThread(Thread, this);
    
    if (WAIT_OBJECT_0 == WaitForSingleObject(DpsThread->m_hThread, INFINITE))
    { return 0;}
    展开全文
  • MFC线程控制

    2017-01-01 11:14:16
    线程启动后可以暂停(有的人喜欢叫挂起),继续,终止,这里就以上次做的MFC创建线程的小例子做些修改,将Button2标题改为启动,再添加几个按钮,如图 启动按钮(之前的Button2)的处理也做些修改 这里g_pThreadA和g...

    线程启动后可以暂停(有的人喜欢叫挂起),继续,终止,这里就以上次做的MFC创建线程的小例子做些修改,将Button2标题改为启动,再添加几个按钮,如图

    这里写图片描述
    启动按钮(之前的Button2)的处理也做些修改
    这里写图片描述
    这里g_pThreadA和g_bRunningA都是全局变量一个是线程指针,一个是BOOL变量,确定线程是否结束。
    这里写图片描述

    如果要暂停线程,必须线程已启动,所以处理暂停按钮时,判断g_pThreadA是否为NULL,是则提示线程不存在,否则执行g_pThreadA->ResumeThread();
    这里写图片描述
    其他的几个按钮就不一一赘述了,如图
    这里写图片描述

    展开全文
  • MFC线程类CWinThread

    2018-12-05 20:29:32
    MFC线程类CWinThread CWinThread类封装了对线程的操作,它代表在应用程序中一个线程的执行。 CWinThread类的成员变量 m_hThread 线程句柄 m_nThreadID 线程ID m_bAutoDelete 线程结束的时候是否销毁对象 ...
  • MFC线程创建及使用

    2019-04-23 00:41:48
    MFC线程的使用过程大致如下: 1.创建线程 2.创建线程函数 3.结束线程 #创建线程 HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, //安全等级,一般为NULL DWORD dwStackSize, ...
  • 创建MFC线程

    2020-08-21 14:42:02
    但是MFC却把线程区分为两种类型:User Interface(UI) threads和Worker threads,用户界面线程和工作者线程。两类线程的不同之处在于UI线程具有消息循环而工作者线程没有。UI线程可以创建窗口并处理发送给这些窗口的...
  • MFC线程退出方法

    千次阅读 2019-08-13 09:50:32
    MFC使用AfxBeginThread创建线程退出方法: CWinThread * myThread; //线程 bool isThreadBegin = false; //线程退出/执行控制 //创建线程 void CDlg::OnButtonCreateThread() { isThreadBegin = thue; //运行...
  • MFC 线程

    2014-01-09 16:15:11
    线程技术使不同的代码可以同时运行...然而,由于操作系统把C P U的时间分成很短的片段分配给每个线程,这样给人的感觉好像是多个线程真的同时运行。  线程的概念与1 6位环境中的多任务有很大的不同。或许曾听人们
  • MFC线程及实例

    千次阅读 2019-08-02 18:36:43
    MFC里面实现线程的实例 线程是一种从软件到硬件的技术,主要目的是为了提高运行速度,和多任务。 ×××××需要储备的资料(他人的)×××××××××××××××××...
  • 正确关闭MFC线程函数

    2020-04-17 18:16:59
    1.MFC线程有两种,一种称为Work线程,一种称为UI线程。一般情况下Work线程与UI线程的区别主要在于UI线程有消息队列(并不是有没有界面,这点要注意,UI线程也是可以没有界面的)。 2.创建这两种线程的区别也不大...
  • MFC线程的使用

    千次阅读 2019-01-16 20:36:12
    一、创建线程  线程内核对象就是一个包含了线程状态信息的数据结构。每次对CreateThread 的成功调用,系统都会在内部为其分配一个内核对象。创建线程方法: HANDLE WINAPI CreateThread(  LPSECURITY_...
  • 如何安全终止MFC线程

    2019-10-01 13:26:14
    终止线程 有两种情况可以使线程结束:控制函数结束或者根本就不允许线程完成,而提前终止它。我们可以想象在WORD中进行后台打印,如果打印结束了,那线程就可以结束了。如果用户中止了打印,那后台打印线程也要终止...
  • 小弟在此拙作一篇,不谈别的,只谈及如何正确的关闭MFC线程,至于Win32和C RunTime的线程暂不涉及。 一.关于MFC线程  1.MFC线程有两种,一种称为Work线程,一种称为UI线程。一般情况下Work线程与UI...
  • 安全终止MFC线程

    2019-06-22 16:09:59
    有两种情况可以使线程结束:控制函数结束或者根本就不允许线程完成,而提前终止它。我们可以想象在WORD中进行后台打印,如果打印结束了,那线程就可以结束了。如果用户中止了打印,那后台打印线程也要终止了。本文将...
  • MFC 判断线程是否结束

    千次阅读 2013-04-14 11:32:18
    功能: 获取一个结束线程的返回值 函数原形: BOOL GetExitCodeThread( HANDLE hThread, LPDWORD lpExitCode); 参数: hThread 指向欲获取返回值的线程对象的句柄  lpExitCode 用于存储线程的返回值...
  • MFC线程安全问题

    2007-09-28 14:10:00
    MFC线程安全问题最近在工作中使用mfc,发现一个问题,由于使用mfc不久,总结了以下,如下:问题:在KdvDecoder(使用的解码库)中,提供文件解码器功能,其中提供一个进度上报回调函数:typedef void (*pfFileStatCB...
  • MFC线程疑问

    2016-10-12 00:18:16
    我在MFC中用AfxBeginThread 创建一个线程,再在这个线程中创建线程 请问如果第一个线程结束了,第二个线程会自动销毁吗?
  • 如何启动线程 AfxBeginThread 指针则指向新建的线程对象或 NULL。 CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc,//指向工作线程的控件函数。 不能为 NULL。 必须对此函数声明如下: //UINT...
  • MFC线程间通信

    千次阅读 2017-02-08 10:39:36
    如主线程和次线程,次线程与次线程,工作线程和用户界面线程等。这样,线程线程间必定有一个信息传递的渠道。这种线程间的通信不但是难以避免的,而且在多线程编程中也是复杂和频繁的。线程间的通信涉及到4个问题:...
  • mfc如何判断线程结束

    2012-03-29 23:10:24
    因为界面很卡,所以放到线程里: void CTestDlg::OnBUTTONStart() ... GetDlgItem(IDC_BUTTONStart)->... CWinThread *pThread = AfxBeginThread...但是界面又会很卡,请问写法正确吗,怎样判断线程结束
  • MFC线程同步那些事

    2016-12-06 18:17:48
    讲述线程运行及退出时遇到的一些问题和解决办法以及注意事项。一个工业控制项目,用USB口采集数据,程序结构是主进程负责界面和算法,创建一个子线程负责USB通讯,读取数据,死循环。
  • MFC线程处理概述

    千次阅读 2009-01-14 23:57:00
    事实上,Win32 API提供了_beginthreadex函数,可以让用户在底层启动线程。总地来说,Win32 API提供的线程处理的...CWinThread类使用线程本地存储来管理在MFC环境中的线程的上下文信息。一般地说,用户可以直接声明CWi
  • Boost多线程-替换MFC线程

    千次阅读 2014-05-18 12:16:24
    Mfc的多线程看起来简单,可以把线程直接压入向量,由系统类似进行调配,其实在内存的处理问题上留下了漏洞。在新线程里面载入大量流,会导致内存泄露。 方便之处:直接使用结构体传入函数参数,供函数使用。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,034
精华内容 6,413
关键字:

mfc线程结束