首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

怎么实现对话框里,一个按钮终止另一个按钮程序的运行

2013-11-01 
如何实现对话框里,一个按钮终止另一个按钮程序的运行?一个对话框上有两个按钮,按钮A点击后执行一个为时很

如何实现对话框里,一个按钮终止另一个按钮程序的运行?


一个对话框上有两个按钮,

按钮A点击后执行一个为时很长的循环,

现在希望另一个按钮B,点击后可以终止按钮A循环程序的执行,

这该如何实现?


[解决办法]
按钮A函数()
{
   m_hThread = CreateThread(....,线程函数,....);
}

按钮B函数()
{
    m_bQuit = TRUE;
///或者 TerminateThread(m_hThread ,0);
}

线程函数()
{
    while(!m_bQuit)
    {
       指向循环任务;
    }
}
[解决办法]

引用:
按钮A函数()
{
   m_hThread = CreateThread(....,线程函数,....);
}

按钮B函数()
{
    m_bQuit = TRUE;
///或者 TerminateThread(m_hThread ,0);
}

线程函数()
{
    while(!m_bQuit)
    {
       指向循环任务;
    }
}

TerminateThread(m_hThread ,0);是一种非常应该避免使用的方法。
它会立刻中止线程的运行,而不管线程运行到哪里。所以没有回收的资源,没有释放的变量都不管了,这样使用会造成内存泄漏。

你应该在线程的循环中添加一个变量,判断如何它为假就自行退出。

主程序通过设置这个变量通知线程。
[解决办法]
得到进程句柄, 调用TerminateProcess

如果有窗口的进程, 得到其窗口句柄, 发送WM_CLOSE消息.


[解决办法]
只能用线程,如果不用线程,你这个按钮点下去后,界面就会锁死,别一个按钮没办法点
[解决办法]
因为按钮事件都是以消息来驱动的, 你在按钮的响应函数中处理数据, 会导致整个界面的消息循环阻塞掉. 所以你想用另一个按钮来结束, 那是不可能的事情, 因为消息循环已经阻塞, 是不可能再响应你的任何消息了.

解决办法就是 所有耗时的事件使用线程来完成, 不要让消息循环被阻塞, 这时就可以控制了. 用变量, 用事件,什么都好用.
[解决办法]
引用:
只能用线程,如果不用线程,你这个按钮点下去后,界面就会锁死,别一个按钮没办法点

void do_events()
{
 MSG msg;

 while (::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) > 0) {
 if (msg.message == WM_QUIT) {
 break;
 }
 GetMessage(&msg, NULL, 0, 0);
 ::TranslateMessage(&msg);
 ::DispatchMessage(&msg);
 }
}
在循环中加上
DoEvents()就可以了。

热点排行