如何防止双击按钮时,或者多击,按扭方法函数被执行多次,我只要求一次运行.而我用我的方法都没能有效制止://IDC_TONGJIALL为按钮ID
void CTeHaoDlg::OnBnClicked()
{
static int once=1; //锁变量
if(once>0)//防止直接双击时运行得快,两次
{
once--;
GetDlgItem(IDC_TONGJIALL)->EnableWindow(FALSE); 
GetDlgItem(IDC_TONGJIALL)->ShowWindow(SW_HIDE);
UpdateData();
for(int i=0;i<100;i++)
{
  jieguo();//结果运算1 }
JieGuoDLG.ShowWindow(SW_SHOWNORMAL);//显示结果对话框
GetDlgItem(IDC_TONGJIALL)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_TONGJIALL)->EnableWindow(); 
once=1;
}
}
没办法,点击按钮后,,就算禁了隐藏了按钮,或者加了锁变量,但是当运算1没运行完,就又会继续执行多次按钮函数
怎么办,难道要捕捉双击事件?
还是其他方法?
还是??

解决方案 »

  1.   

    GetTickCount与前一次相减,差值大于某值时再执行响应代码。
      

  2.   

    jieguo();//结果运算1 
    你这里可以防止多次进入,运算中判断一下,当前还没运算完,直接返回...
      

  3.   

    运算时设置开关变量k
    判断k设置跳过执行运算
    运算晚再设置开关变量有
    if(k)
    {
      k=0;
      jishuan();
      //k=-1;只运行1次注释掉就行了}
      

  4.   

    其实我这个
    for(int i=0;i <100;i++) 

      jieguo();//结果运算1 } 是有点多余~
    直接用
    funabc();
    就可以了~
    也就是
    按钮涵数误被双击,运行时多击,就算我设置禁用和锁变量,funabc()都被运行多次了不明白为什么我以上的控制会失效~
    不明白为什么我以上的控制会失效~难道真的要用GetTickCount() ?
      

  5.   


    BOOL CYourDlg::PreTranslateMessage(MSG* pMsg) 
    {
    // TODO: Add your specialized code here and/or call the base class
    if(pMsg->message == WM_LBUTTONDBLCLK && pMsg->hwnd == GetDlgItem(IDC_BUTTON)->GetSafeHwnd())
    //Add your function
    return CDialog::PreTranslateMessage(pMsg);
    }
      

  6.   

    如果单纯防止按键误被双击,GetTickCount()这办法不错,不看cnzdgs的回贴还真不知道,学习了但不明白LZ为啥要防止[误被双击]呢,写代码的接触钮不是1个2个,都这样会很麻烦,如果这个按钮很特殊,应该在程序架构上找别的办法,一定有的不明白为什么我以上的控制会失效~ 
    因为主线程和其它线程一样,都只有1个堆栈来维护,你点1次,就压1个,执行的时候,上1个OnBnClicked() 没用执行完,是不会执行到下一个的,因为它们在同一个线程,
    你在OnBnClicked() 内部搞什么动作都基本没用m_bIsCan = true;
    OnBnClicked()
    {   
        m_bIsCan = false;
       .......
         m_bIsCan = true;    
    }
    这个执行完了再执行//到了这m_bIsCan一定是true;因为上1次执行完了才会轮到下1个
    OnBnClicked()
    {
        m_bIsCan = false;
       .......
         m_bIsCan = true;    
    }