zoukankan      html  css  js  c++  java
  • MFC多线程的创建使用

    最近学习了MFC多线程的使用,

    写了一个继承CWinThread类的类MyThread;

    在头文件开头用#define定义一个线程函数入口地址(会在下面定义代码中写出)

    在类的开头加上IMPLEMENT_DYNCREATE(MyThread, CWinThread)

    继承的子类里面必须重写两个函数

    一、virtual BOOL InitInstance();
    二、virtual int ExitInstance();

    声明一个线程函数,函数名自定,我的类中的线程函数叫StartThread

    在声明完线程函数后再声明DECLARE_MESSAGE_MAP(),该函数包含了消息映射必要的函数,声明了它就相当于在类内声明了这些提供消息映射必要的函数。

    头文件中类定义如下:

    #ifndef T_THREAD_H
    #define T_THREAD_H  
    #pragma once
    #define WM_TEST  WM_USER + 105 //定义线程函数入口地址
    class mythread1 : public CWinThread
    {
    	DECLARE_DYNCREATE(MyThread)
    public: 
    	MyThread();
    	virtual BOOL InitInstance();
    	virtual int ExitInstance();
    	void StartThread(WPARAM wParam, LPARAM lParam);
    	DECLARE_MESSAGE_MAP();
    };
    #endif
    

    然后在CPP文件开头加上IMPLEMENT_DYNCREATE(MyThread, CWinThread)

    这样做的意图在于使能Cobject派生类的对象在运行时动态被创建。

    然后在重写了

    BOOL InitInstance(); 

    int ExitInstance();

    两个函数的定义后,在定义线程函数时加上下面的语句

    BEGIN_MESSAGE_MAP(MyThread, CWinThread)
        ON_THREAD_MESSAGE(WM_TEST, StartThread)
    END_MESSAGE_MAP()

    这三条代码的作用是将线程消息传递路由定义好

    关于这三条语句以及类中声明的消息映射函数我是参考这篇博客https://blog.csdn.net/luoti784600/article/details/10070939

    cpp代码如下

    #include "stdafx.h"
    #include "t_thread.h"
    IMPLEMENT_DYNCREATE(MyThread, CWinThread)
    
    MyThread::MyThread()
    {
    	
    }
    
    BOOL MyThread::InitInstance()
    {
    	return true;
    }
    int MyThread::ExitInstance()
    {
    	return 0;
    }
    BEGIN_MESSAGE_MAP(MyThread, CWinThread)
    	ON_THREAD_MESSAGE(WM_TEST, StartThread)
    END_MESSAGE_MAP()
    void mythread1::StartThread(WPARAM wParam, LPARAM lParam)
    {
    	while (true)
    	{
    		TRACE("2
    ");
    		Sleep(1000);
    	}
    	::AfxEndThread(2015);	
    }
    

    在线程内调用AfxEndThread将会直接结束线程,此时线程的一切资源都会被回收,函数的参数是nExitCode,可以通过GetExitCodeThread获得。

     然后按键消息函数中开启线程,开启线程的方式是先声明定义一个线程类指针

    MyThread* p_MyThread;

    再用AfxBeginThread获得线程指针

    p_MyThread= (MyThread*)AfxBeginThread(RUNTIME_CLASS(MyThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);

    AfxBeginThread有两种重载函数定义,一种叫工作线程,一种叫用户界面线程,通过输入参数的不同区别,本例中使用的是用户界面线程,

    关于AfxBeginThread两种函数定义的介绍,可以参考https://blog.csdn.net/MissXy_/article/details/80330263

    按键消息函数内代码如下:

    void CmythreadDlg::OnBnClickedOk()
    {
    	// TODO:  在此添加控件通知处理程序代码
    
    	p_MyThread= (MyThread*)AfxBeginThread(RUNTIME_CLASS(MyThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
    	p_MyThread->ResumeThread();
    	p_MyThread->PostThreadMessage(WM_TEST, NULL, NULL);
    	display();
    }
    void CmythreadDlg::display()
    {
    	while (1)
    	{
    		TRACE("1
    ");
    		Sleep(1000);
    	}	
    }
    

     本例的意图是用两个线程,分别打印出1,2两个数字。

    运行结果如下:

    记录完毕,欢迎指出不足!

  • 相关阅读:
    ORACLE修改列名与列类型
    ORACLE的显式游标与隐式游标
    ORACLE 异常错误处理
    ORACLE的强制索引
    看懂ORACLE执行计划
    ORACLE建立物化视图
    普通视图和物化视图的区别
    ORACLE 中 TRANSLATE的用法
    随手小代码——归并排序
    随手小代码——选择算法排序
  • 原文地址:https://www.cnblogs.com/leo-lv/p/11417054.html
Copyright © 2011-2022 走看看