如何实现对话框里,一个按钮终止另一个按钮程序的运行?
一个对话框上有两个按钮,
按钮A点击后执行一个为时很长的循环,
现在希望另一个按钮B,点击后可以终止按钮A循环程序的执行,
这该如何实现?
[解决办法]
按钮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()就可以了。