如何防止双击按钮时,或者多击,按扭方法函数被执行多次,我只要求一次运行.而我用我的方法都没能有效制止://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没运行完,就又会继续执行多次按钮函数
怎么办,难道要捕捉双击事件?
还是其他方法?
还是??
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没运行完,就又会继续执行多次按钮函数
怎么办,难道要捕捉双击事件?
还是其他方法?
还是??
解决方案 »
- 自己正用VC开发一个基于WEB BROWSER 控件的对话框程序,因为NEWWINDOW2无法使用,想知道如何用BHO配合
- fwrite和SetItemText速度问题
- 问题怎么把秒转换成年月日方式(用time_t 或 tm)方式
- 初学者问一个菜菜的问题~~~在线等~~~
- 高级问题急救?(CORBA和C++数据库访问ado问题)
- 循环20000000次所需要时间(急)
- .net的问题
- 如何得到鼠标位置
- GetCharPos 和 PosFromChar的效果有区别吗?
- 这段代码(ado,vc,access2000)连数据库,为何抛出异常?
- 求教:自画CTabCtrl
- 如何使滚动条跳转到任意行???
你这里可以防止多次进入,运算中判断一下,当前还没运算完,直接返回...
判断k设置跳过执行运算
运算晚再设置开关变量有
if(k)
{
k=0;
jishuan();
//k=-1;只运行1次注释掉就行了}
for(int i=0;i <100;i++)
{
jieguo();//结果运算1 } 是有点多余~
直接用
funabc();
就可以了~
也就是
按钮涵数误被双击,运行时多击,就算我设置禁用和锁变量,funabc()都被运行多次了不明白为什么我以上的控制会失效~
不明白为什么我以上的控制会失效~难道真的要用GetTickCount() ?
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);
}
因为主线程和其它线程一样,都只有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;
}