我的程序需要每按一个按钮就执行一个比较占资源且时间比较长的算法. 我将这个算法在一个新的线程中执行.
void CPasswordDlg::OnButton1() 
{
// TODO: Add your control notification handler code here
CreateThread(NULL,NULL,MyThreadProc,this,NULL,NULL); //新建线程
}DWORD WINAPI CPasswordDlg::MyThreadProc(LPVOID   pParam) 

.....
return true;
}我的问题是我每按一次按钮就新建一个线程, 且这个线程序只执行一次就return true. 以上这种做法否正确?几个方面
用哪种方式更好?

解决方案 »

  1.   

    DWORD WINAPI CPasswordDlg::MyThreadProc(LPVOID pParam)  
    {  
    while(1)
    {
        .....//在这里实现你想做的
    }
    return true;
    }
      

  2.   

    每按一次按钮就新建一个线程, 且这个线程序只执行一次就return true
    正确,有何不妥?
      

  3.   

    只创建一个线程,执行完成以后,挂起WaitForSingleObject();可以利用事件对象,SetEvent();
      

  4.   

    没有啥问题,你觉得创建线程开销太大的话,用线程池就是了。另外,最好不要用CreateThread,用这个函数启动线程,是没有建立C的多线程运行环境的,调用某些C库的函数可能会导致程序崩溃。
      

  5.   

    哦. 是否在线程中return true后. 该线程就自动销毁了? 因为下次按键的时候还是会CreateThread.
      

  6.   

    是否在线程中return true后. 该线程就自动销毁了?
      

  7.   

    是否在线程中return true后,线程就停止运行了,但是线程的资源还没有释放,需要用CloseHandle关闭创建线程时返回的句柄。
      

  8.   

    unsigned int __stdcall thread_fun1(void *param) 
    {
    .....
        return 0;
    }void CMainFrame::OnCreatePassword() 
    {
    // TODO: Add your command handler code here
    ThreadInfo ThisThreadInfo;
    HANDLE thread1 = (HANDLE)_beginthreadex(0,0,&thread_fun1,0,0,(unsigned int*)&ThisThreadInfo); //thread 1
    WaitForSingleObject(thread1,INFINITE);
    }
    请问这种用法是否正确? 另外如果我还在执行该线程时候, 这时候用户关掉了整个工程程序. 是否会有异常产生? 如何防止正在执行线程时候关掉整个工程?
      

  9.   


    这样分两种情况了。一、在用户第二次按下之前,计算已经完成。那么就没什么影响了。二、还未完成。  那就要想其他办法了。比如:
    void CMainFrame::OnCreatePassword()  
    {
    // TODO: Add your command handler code here
    ThreadInfo ThisThreadInfo;在其他地方将thread1初始化为0,不要在这个函数里。if (thread1 == 0 )    //确定上次线程已经执行完毕
    {HANDLE thread1 = (HANDLE)_beginthreadex(0,0,&thread_fun1,0,0,(unsigned int*)&ThisThreadInfo); //thread 1
    WaitForSingleObject(thread1,INFINITE);thread1 = 0;}else{可以加些提醒用户的语句,说明上次计算还未结束。}

    }