step1: 添加声明
DWORD WINAPI TimerThread(LPVOID pamaram) ;
CRITICAL_SECTION g_cs; //
step2:开辟线程
InitializeCriticalSection(&g_cs); //先初始化临界区
HANDLE ShowT1= CreateThread(NULL,
0,
TimerThread,
this,
NULL,
NULL);
// HANDLE ShowT2= CreateThread(NULL,
// 0,
// TimerThread1,
// this,
// NULL,
// NULL);
DeleteCriticalSection(&g_cs);
说明:sunxin MFC中说需要对多线程临界初始化
step3:线程函数
DWORD WINAPI TimerThread(LPVOID pamaram)
{
UINT oldTickCount, newTickCount;
oldTickCount = GetTickCount();
CTextDlg* test=(CTextDlg*)pamaram; //需要对窗体对象实例化
while(TRUE)
{
while(TRUE)
{
newTickCount = GetTickCount();
if(newTickCount - oldTickCount >= 10)
{
oldTickCount = newTickCount;
break;
}
else
Sleep(0); //腾出时间片让其他线程执行,这样可以提高在单核机器的CPU的执行效率
}
// 1000毫秒自动调用函数
test->testShow();
}
return 0;
}
step4: 显示函数
void CTextDlg::testShow()
{
UpdateData(FALSE);
static i=1;
m_Edit_Test=i++;
}
编译环境VC6.0
不足: 只能在Release模式下运行,debug下会报错wincore.cpp 890Line
原因待查:
MFC类不支持多线程内CTextDlg* test=(CTextDlg*)pamaram这么操作.所以:
UpdateData(FALSE)语句用SendMessage(WM_UPDATEDATA, FALSE)替代即可.
xxdlg.h文件中:
#define WM_UPDATEDATA WM_USER + 5
LRESULT OnUpdateData(WPARAM wParam, LPARAM lParam);
xxdlg.cpp文件中:
//函数映射 :
ON_MESSAGE(WM_UPDATEDATA, OnUpdateData)
//定义新函数:
LRESULT CProtectPage::OnUpdateData(WPARAM wParam, LPARAM lParam)
{
UpdateData(wParam);
return 0;
}
//传消息给窗口:
子线程中需要刷新显示的地方使用:
SendMessage(WM_UPDATEDATA, FALSE)
参考:
http://pfa2008.blog.163.com/blog/static/60200748201071510561771/
http://blog.sina.com.cn/s/blog_4c73004f01000a72.html
转载于:https://blog.51cto.com/8298926/1347805