我在自绘进度条时用到创建线程,在绘制进度条函数中CreateThread,现在问题是当打开显示进度条界面时就已经是全部画完的效果。//绘制进度颜色
void CMyProgress::ProgressColor(HWND _hwnd)
{
hThread = CreateThread(NULL, 0, ThreadProc, (LPVOID)this, 0, &m_dwRID);
//创建事件对象
hREvent = CreateEvent(NULL, FALSE, FALSE, NULL);
//无限等待
WaitForSingleObject(hREvent, INFINITE);
CloseHandle(hREvent);
hREvent = NULL;
}void CMyProgress::Draw_Color()
{
HBITMAP hOldbmp = (HBITMAP) SelectObject(imgdc, m_hProgressColor);
static int i=(PROGRESSBAR_X+1);
BitBlt(g, i, PROGRESSBAR_Y, PROGRESSBAR_WIDE, PROGRESSBAR_HIGH, imgdc, 0, 0, SRCCOPY);
SelectObject(imgdc, hOldbmp);
//绘制结束
(i<PROGRESSBAR_WIDE) ? (++i) : (msg.message = UM_QUITMSG);
}//回调函数
DWORD ThreadProc(LPVOID lpParameter)
{
CMyProgress* pProgress = (CMyProgress*)lpParameter;
//事件已发生
SetEvent(hREvent);
//死循环
while(1)
{
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
//结束消息
if (UM_QUITMSG == msg.message)
{
return 0;
}
}
else
{
//绘制进度颜色
pProgress->Draw_Color(); }
}
CloseHandle(hThread);
hThread = NULL;
return 0;
} 请问线程哪里用错了呢? 谢谢大家
void CMyProgress::ProgressColor(HWND _hwnd)
{
hThread = CreateThread(NULL, 0, ThreadProc, (LPVOID)this, 0, &m_dwRID);
//创建事件对象
hREvent = CreateEvent(NULL, FALSE, FALSE, NULL);
//无限等待
WaitForSingleObject(hREvent, INFINITE);
CloseHandle(hREvent);
hREvent = NULL;
}void CMyProgress::Draw_Color()
{
HBITMAP hOldbmp = (HBITMAP) SelectObject(imgdc, m_hProgressColor);
static int i=(PROGRESSBAR_X+1);
BitBlt(g, i, PROGRESSBAR_Y, PROGRESSBAR_WIDE, PROGRESSBAR_HIGH, imgdc, 0, 0, SRCCOPY);
SelectObject(imgdc, hOldbmp);
//绘制结束
(i<PROGRESSBAR_WIDE) ? (++i) : (msg.message = UM_QUITMSG);
}//回调函数
DWORD ThreadProc(LPVOID lpParameter)
{
CMyProgress* pProgress = (CMyProgress*)lpParameter;
//事件已发生
SetEvent(hREvent);
//死循环
while(1)
{
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
//结束消息
if (UM_QUITMSG == msg.message)
{
return 0;
}
}
else
{
//绘制进度颜色
pProgress->Draw_Color(); }
}
CloseHandle(hThread);
hThread = NULL;
return 0;
} 请问线程哪里用错了呢? 谢谢大家
//事件已发生
SetEvent(hREvent);
事件有效,因此会唤起父线程
//无限等待
WaitForSingleObject(hREvent, INFINITE);
CloseHandle(hREvent);//即此处
hREvent = NULL;
然后线程退出。
你可以在循环中加入Sleep(10);来试试
//每一帖起始时间
void ENtime::countGetTickCount()
{
IniFrameDelay=GetTickCount();//获得豪秒
// cout<<"IniFrameDelay:"<<IniFrameDelay<<endl;
}
//计算每一帖帖速
void ENtime::countFrameSpeed()
{
FrameDelay=GetTickCount() - IniFrameDelay;//每一帖的帖速
// cout<<"FrameDelay:"<<FrameDelay<<" SetSpeedValue:"<<SetSpeedValue<<endl;
}
//控制相对帖速
int ENtime::setFrameSpeed(float speed)
{
SetSpeedValue=speed;//设置帖速
return 1;
}
//获取相对帖速值
int ENtime::getFrameSpeed()
{
return SetSpeedValue;
}
//设置sleep
bool ENtime::FrameSleep()
{
FrameDelay=GetTickCount() - IniFrameDelay;//每一帖的帖速
if(FrameDelay < SetSpeedValue)
{
::Sleep(SetSpeedValue - FrameDelay);//主动放弃CPU使用时间
// ::Sleep(SetSpeedValue);//主动放弃CPU使用时间
return 0;//帖速不合符要求
}
return 1;//帖速合符要求
}
float ENtime::getFrameDelay()
{
return FrameDelay;
}
float ENtime::getSecond()
{
return Second;
}
int ENtime::CheckTimeOut(float &savetime,float space)
{
if(Second>=savetime+space)
{
savetime=Second;
return 1;
}
return 0;
}
//获取系统时间方法1
SYSTEMTIME ENtime::getSystemTime1()
{
SYSTEMTIME lpSystemTime;//系统时间
GetSystemTime(&lpSystemTime);
return lpSystemTime;
}
//获取系统时间方法2
tm* ENtime::getSystemTime2()
{
time_t t;
struct tm *ptm;
time(&t);
ptm = localtime(&t);
return ptm;
}