我的程序需要每按一个按钮就执行一个比较占资源且时间比较长的算法. 我将这个算法在一个新的线程中执行.
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. 以上这种做法否正确?几个方面
用哪种方式更好?
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. 以上这种做法否正确?几个方面
用哪种方式更好?
{
while(1)
{
.....//在这里实现你想做的
}
return true;
}
正确,有何不妥?
是
{
.....
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);
}
请问这种用法是否正确? 另外如果我还在执行该线程时候, 这时候用户关掉了整个工程程序. 是否会有异常产生? 如何防止正在执行线程时候关掉整个工程?
这样分两种情况了。一、在用户第二次按下之前,计算已经完成。那么就没什么影响了。二、还未完成。 那就要想其他办法了。比如:
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{可以加些提醒用户的语句,说明上次计算还未结束。}
}