如何实现对话框里,一个按钮终止另一个按钮程序的运行? 一个对话框上有两个按钮,按钮A点击后执行一个为时很长的循环,现在希望另一个按钮B,点击后可以终止按钮A循环程序的执行,这该如何实现? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 点击钮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消息. 楼上说的都太麻烦,定义一个全局BOOL变量,在按钮A启动的循环代码中(或者是线程函数)每次循环时先检测一下该变量,按钮B用来控制一下该BOOL变量的状态不就行了? 谢谢楼上各位,我用了线程,可是现在有个问题:我编了线程处理函数:void fun();然后创建线程的时候:CreateThread(NULL,0, (LPTHREAD_START_ROUTINE)fun,NULL,0,NULL);报错:错误 1 error C2440: “类型转换”: 无法从“overloaded-function”转换为“LPTHREAD_START_ROUTINE” 请问这是为什么? 我发现现在的问题了,按钮A的函数是在对话框的类里实现的,但是线程函数必须是类外的函数才行,否则CreateThread时候,第三个参数函数指针会报错,可是A的函数必须在对话框类里实现才行,这该怎么办??? 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()就可以了。 点击按钮,产生对话框,里面用了NEW字符,但是加上delete老是出错 关于CSizingControlBar的用法。 动态去掉(隐藏)标题栏 的问题 SHFileOperation奇怪死了 在picture控件里画图,不能自动刷新怎么办 up就有分 各位朋友给点建议。(百分求教) 请老忘进来领分 哪里能得到Rational Rose 2001的协议文件?愁死我也! OnTimer不响应求助大神 对话框问题 VS2010中 如何在封装好的动态库中获得CMainFrame类指针
点击按钮B后 结束按钮A的线程
{
m_hThread = CreateThread(....,线程函数,....);
}按钮B函数()
{
m_bQuit = TRUE;
///或者 TerminateThread(m_hThread ,0);
}线程函数()
{
while(!m_bQuit)
{
指向循环任务;
}
}
它会立刻中止线程的运行,而不管线程运行到哪里。所以没有回收的资源,没有释放的变量都不管了,这样使用会造成内存泄漏。你应该在线程的循环中添加一个变量,判断如何它为假就自行退出。主程序通过设置这个变量通知线程。
{
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()就可以了。