zoukankan      html  css  js  c++  java
  • 用静态成员函数调用非静态成员变量

    今天写程序要用到一个计时器,然后需要创建一个新的线程,这个线程是CtestDLG的一个成员函数,必须定义为静态的.但是这个时候就不能去访问非静态成员变量了,这里找到一个很好的解决办法:

    先上代码:

    1.线程函数的定义:

    private:
        int Count_time;
        CTime C_time;
        bool GetQuestion();
        int mark;//考试分值,五个题目,一个20分,满分100
        int QS[5];//随机题库序号
        int count2;//题库总数
        int count_Q;//当前输出的题目数量
        static DWORD WINAPI Fun_Time(LPVOID lpParameter);
    };

    我们可以看到这个是一个类的成员函数

    2.创建线程

    void CTESTDlg::ONTIME()
    {
        HANDLE pThread_time = NULL;
        pThread_time = CreateThread(NULL,0,Fun_Time,this,0,NULL);
    }

    这个是在一个消息函数中创建的.第四个参数传递的是一个this指针,指向当前的窗口类(这里很重要)

    2.具体实现

    DWORD WINAPI CTESTDlg::Fun_Time(LPVOID lpParameter)
    {
        CTESTDlg* temp = (CTESTDlg*)lpParameter;
        temp->Count_time++;
        while(1)
        {
            AfxMessageBox("s");
        }
        return 0;
    }

    这里我们可以看到,窗口句柄传递过来,然后通过强制类型转换,将它复制给一个新的临时变量,然后用这个临时的指针就可以去访问类的成员了.很好的一个解决办法!!

    思想的总结如下:

    创建线程时,线程函数如果要设置成类的成员函数,则必须是静态成员函数,在此函数种不能使用非静态成员变量,如果要使用非静态成员变量,则一种比较适合线程的方法是:建立线程的时候把this作为CreateThread的一个参数(即第4个参数,就是那个LPVOID型的),然后线程里就对应pParam,例如:
    static UINT ThreadProc(LPVOID pParam) 

         Your_Class *p=(Your_Class *)pParam; 
         //然后用p间接使用成员变量。 
       }

    线程函数是回调函数,因此它必须是静态成员函数或者是类外部声明的全局函数。

  • 相关阅读:
    bzoj1904: Musical Water-fence
    bzoj3822: 文学
    bzoj1513: [POI2006]Tet-Tetris 3D
    bzoj4130: [PA2011]Kangaroos
    bzoj2515 Room
    bzoj2518: [Shoi2010]滚动的正四面体
    bzoj4617: [Wf2016]Spin Doctor
    bzoj3086: Coci2009 dvapravca
    bzoj3745: [Coci2015]Norma
    bzoj1837: [CROATIAN2009]cavli 凸包1
  • 原文地址:https://www.cnblogs.com/color-my-life/p/3219669.html
Copyright © 2011-2022 走看看