CreateThread() 函数中的lpStartAddress参数可否为 某个类的成员函数?

kuanghong 2002-03-26 12:52:56
#include "stdafx.h"
#include "ball.h"
Cball::Cball(HWND hCanvas,int nR,int nX,int nY,int nDelay)
{
this->hCanvas = hCanvas;
this->nR = nR;
this->nX = nX;
this->nY = nY;
this->nDelay = nDelay;
}
Cball::Cball(HWND hCanvas,int nR,int nDelay)
{
this ->hCanvas = hCanvas;
this ->nR = nR;
RECT rt;
GetClientRect (hCanvas,&rt);
this ->nX = nR;
this ->nY = rt.bottom - nR;
this ->nDelay = nDelay;
}
void Cball::setBrush(HBRUSH hBrush)
{
this ->hBrush = hBrush;
}
void Cball::start()
{
if (hThread!=NULL )return;
/*
下面这行语句这样写为什么不行?
*/
hThread = CreateThread (NULL,0,run,0,CREATE_SUSPENDED,NULL);
}
void Cball::resume()
{
ResumeThread (hThread);
}
void Cball::pause()
{
SuspendThread (hThread);
}
void Cball::stop()
{
TerminateThread (hThread,0);
}
DWORD WINAPI Cball::run(LPVOID lpParam)
{
HDC hdc;
int nXO,nYO;
HBRUSH hBrushOld;
hdc = GetDC (hCanvas);
if (hBrush!=FALSE)
hBrushOld = (HBRUSH)SelectObject (hdc,hBrush);
while(1)
{

RECT r;
GetClientRect (hCanvas,&r);
if (nX>=r.right || nX<=r.left )nXO = - nXO;
if (nY>=r.bottom || nY<=r.top)nYO = -nYO;
nX += 5 * nXO;
nY += 5 * nYO;
Ellipse (hdc,nX - nR,nY - nR,nX + nR,nY + nR);
InvalidateRect (hCanvas,&r,TRUE);
Sleep (nDelay);

}
ReleaseDC (hCanvas,hdc);
if (hBrushOld != FALSE)
SelectObject (hdc,hBrushOld);
return 0;
}
...全文
47 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Erlin 2002-03-26
  • 打赏
  • 举报
回复

线程函数一定需要是全局函数。

如果你一定要用某个类的成员函数,那么你要将它声明成静态的。



ndsm 2002-03-26
  • 打赏
  • 举报
回复
CREATE_SUSPENDED必须是static的

16,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧