多线程下代替定时器的使用

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


你可能感兴趣的:(多线程,定时器)