• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
生若秋叶
gonna to be a designer,a designer of my life!!
博客园    首页    新随笔    联系   管理    订阅  订阅

用静态成员函数调用非静态成员变量

今天写程序要用到一个计时器,然后需要创建一个新的线程,这个线程是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间接使用成员变量。 
   }

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

posted @ 2013-07-27 16:12  HappyCoder  阅读(8110)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3