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