定义了CALLBACK的TIMER函数,但是里面不能调用类中的其他函数,恳请各位老大帮忙。VC的界面上,点击一个命令菜单,要进行的操作是,向后台发一个读取设定状态的进程(后台是用死循环来接收指令的),要获取某芯片的一些设定信息,保存在全局变量里面,结果表示在界面上。处理思路如下:
1,生成一个计时器TIMER(4秒),发出进程(该进程进入死循环后,也是用TIMER来等待读取结果,时间设为4秒,超时则报错);
2,TIMER时间到了之后,在TIMER处理里面调用刷新界面的程序,关闭TIMER。
结果:CALLBACK的TIMER程序中,不能调用该类的其他函数。错误信息好像是不能调用实参数。不知道该怎么办了,急死人了。上司都怒了。各位老大拯救我啊。
/////////////////////////////////////////////////////
具体处理如下:
头文件中定义CALLBACK 的TIMER函数如下:
public:
static void CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime);
该界面类程序最初,定义TIMER如下
UINT timerid1;
BOOL m_Data_timerExceed ;处理函数:
void ……Mode::……CurSeg()
{
if(!pParent->pleaseGetSegData()//发出进程
……
Timerid1 = ::SetTimer(NULL, BIN_RECV_TIMER, 5000, TimerProc);//启动TIMER
}^::TimerProc(HWND hwnd, UINT uMsg,UINT idEvent, DWORD dwTime){bool bChk;
bChk = TRUE;if(m_Data_timerExceed == TRUE )
{
// ((CButton*)GetDlgItem(IDC_BITCHECK0+2))->SetCheck(TRUE);//这个也不能调用。
// showCheckData();//这个不能调用。
m_Data_timerExceed = FALSE;
AfxMessageBox("aa");
::KillTimer(0, timerid1);
}
m_Data_timerExceed = TRUE;}
/////////各位老大,帮忙啊。
1,生成一个计时器TIMER(4秒),发出进程(该进程进入死循环后,也是用TIMER来等待读取结果,时间设为4秒,超时则报错);
2,TIMER时间到了之后,在TIMER处理里面调用刷新界面的程序,关闭TIMER。
结果:CALLBACK的TIMER程序中,不能调用该类的其他函数。错误信息好像是不能调用实参数。不知道该怎么办了,急死人了。上司都怒了。各位老大拯救我啊。
/////////////////////////////////////////////////////
具体处理如下:
头文件中定义CALLBACK 的TIMER函数如下:
public:
static void CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime);
该界面类程序最初,定义TIMER如下
UINT timerid1;
BOOL m_Data_timerExceed ;处理函数:
void ……Mode::……CurSeg()
{
if(!pParent->pleaseGetSegData()//发出进程
……
Timerid1 = ::SetTimer(NULL, BIN_RECV_TIMER, 5000, TimerProc);//启动TIMER
}^::TimerProc(HWND hwnd, UINT uMsg,UINT idEvent, DWORD dwTime){bool bChk;
bChk = TRUE;if(m_Data_timerExceed == TRUE )
{
// ((CButton*)GetDlgItem(IDC_BITCHECK0+2))->SetCheck(TRUE);//这个也不能调用。
// showCheckData();//这个不能调用。
m_Data_timerExceed = FALSE;
AfxMessageBox("aa");
::KillTimer(0, timerid1);
}
m_Data_timerExceed = TRUE;}
/////////各位老大,帮忙啊。
2.在TimerProc向对话框发送自定义消息,通知其更新。
而且连this->都用不了。
CWnd::SendMessage(WM_MYMSG,0,0);
::SendMessage(WM_MYMSG,0,0);都用不了。
http://msdn2.microsoft.com/en-us/library/ms644901(VS.85).aspx
// 开始计时器
Timerid1 = ::SetTimer(GetSafeHwnd(), BIN_RECV_TIMER, 5000, TimerProc);//启动TIMER // 回调
TimerProc(HWND hwnd, UINT uMsg,UINT idEvent, DWORD dwTime)
{
::SendMessage(hwnd, WM_MY_UPDATE, 0, 0);
}
改成所在窗体的成员函数试试: static void CALLBACK CxxxDlg::TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime);
protected:
……
afx_msg LRESULT OnMenuRefresh(WPARAM wParam,LPARAM lParam);
DECLARE_MESSAGE_MAP()cpp文件中:
/////声明
BEGIN_MESSAGE_MAP(……Mode, CDialog)
……
ON_MESSAGE(WM_MYMSG, OnMenuRefresh)
END_MESSAGE_MAP()/////函数
LRESULT ……Mode::OnMenuRefresh(WPARAM wParam,LPARAM lParam)
{
((CButton*)GetDlgItem(IDC_BITCHECK0))->SetCheck(TRUE);//类中其他函数可以直接调用本句
updateBits(m_scrollBar.GetScrollPos());//类中其他函数可以直接调用本句
return 0L;
}/////调用处void CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
{ bool bChk;
bChk = TRUE;
if(m_Data_timerExceed == TRUE )
{
m_Data_timerExceed = FALSE;
::SendMessage(hwnd,WM_MYMSG,0,0);
AfxMessageBox("aa");//对话框能正确弹出
::KillTimer(0, timerid1);
}
m_Data_timerExceed = TRUE;}再拜各位老大。
响应了对话框的TIMER事件就轻松解决了。
CALLBACK,自定义消息,全局保存hwnd的方法虽然也成功了,但是添加TIMER事件无疑更简单。