定义了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.   

    1.相应对话框的 WM_TIMER 事件。
    2.在TimerProc向对话框发送自定义消息,通知其更新。
      

  2.   

    已经定义了自定义的消息,但是调用消息的时候,出现的错误信息和调别的函数一样,都是静态函数中调用不正确。
    而且连this->都用不了。
      

  3.   

    this->SendMessage(WM_MYMSG,0,0);
    CWnd::SendMessage(WM_MYMSG,0,0);
    ::SendMessage(WM_MYMSG,0,0);都用不了。
      

  4.   

    静态函数中当然没有 this 了。// 计时器的使用
    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);
    }
      

  5.   

    将static void CALLBACK  TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime); 
    改成所在窗体的成员函数试试: static void CALLBACK CxxxDlg::TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime); 
      

  6.   

    再问各位老大。定义了消息处理,为何根本进不去?根本没进入OnMenuRefresh,对话框倒是正确弹出了。H文件中:
    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;}再拜各位老大。
      

  7.   

    是不是hwnd的值不对??你在外面全局保存……Mode窗口的句柄(hmywnd = this->m_hWnd;),然后在时间回调函数中SendMessage(hwnd,WM_MYMSG,0,0); 的时候全局保存的句柄替换hwnd再试试..
      

  8.   

    感谢各位老大
    响应了对话框的TIMER事件就轻松解决了。
    CALLBACK,自定义消息,全局保存hwnd的方法虽然也成功了,但是添加TIMER事件无疑更简单。