多線程下代替定時器的使用

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章