一个对话框上有两个按钮,按钮A点击后执行一个为时很长的循环,现在希望另一个按钮B,点击后可以终止按钮A循环程序的执行,这该如何实现?

解决方案 »

  1.   

    点击钮A后 开启一个线程去执行你的循环任务
    点击按钮B后 结束按钮A的线程
      

  2.   

    按钮A函数()
    {
       m_hThread = CreateThread(....,线程函数,....);
    }按钮B函数()
    {
        m_bQuit = TRUE;
    ///或者 TerminateThread(m_hThread ,0);
    }线程函数()
    {
        while(!m_bQuit)
        {
           指向循环任务;
        }
    }
      

  3.   

    TerminateThread(m_hThread ,0);是一种非常应该避免使用的方法。
    它会立刻中止线程的运行,而不管线程运行到哪里。所以没有回收的资源,没有释放的变量都不管了,这样使用会造成内存泄漏。你应该在线程的循环中添加一个变量,判断如何它为假就自行退出。主程序通过设置这个变量通知线程。
      

  4.   

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

  5.   

    楼上说的都太麻烦,定义一个全局BOOL变量,在按钮A启动的循环代码中(或者是线程函数)每次循环时先检测一下该变量,按钮B用来控制一下该BOOL变量的状态不就行了?
      

  6.   

    谢谢楼上各位,我用了线程,可是现在有个问题:我编了线程处理函数:void fun();然后创建线程的时候:CreateThread(NULL,0, (LPTHREAD_START_ROUTINE)fun,NULL,0,NULL);报错:错误 1 error C2440: “类型转换”: 无法从“overloaded-function”转换为“LPTHREAD_START_ROUTINE” 请问这是为什么?
      

  7.   

    我发现现在的问题了,按钮A的函数是在对话框的类里实现的,但是线程函数必须是类外的函数才行,否则CreateThread时候,第三个参数函数指针会报错,可是A的函数必须在对话框类里实现才行,这该怎么办???
      

  8.   

    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()就可以了。