很多程序在创建线程都这样写的:
显示代码打印1 ThreadHandle = CreateThread(NULL,0,.....);
2 CloseHandel(ThreadHandle );
这不是刚好创建又关闭了吗?线程怎么运行呢?
答:
Closing a thread handle does not terminate the associated thread. To remove a thread object, you must terminate the thread, then close all handles to the thread.
引自MSDN
1,线程和线程句柄(Handle)不是一个东西,线程是在cpu上运行的.....(说不清楚了),线程句柄是一个内核对象。我们可以通过句柄来操作线程,但是线程的生命周期和线程句柄的生命周期不一样的。线程的生命周期就是线程函数从开始执行到return,线程句柄的生命周期是从CreateThread返回到你CloseHandle()。
2,所有的内核对象(包括线程Handle)都是系统资源,用了要还的,也就是说用完后一定要closehandle关闭之,如果不这么做,你系统的句柄资源很快就用光了。
3,如果你CreateThread以后需要对这个线程做一些操作,比如改变优先级,被其他线程等待,强制TermateThread等,就要保存这个句柄,使用完了在CloseHandle。如果你开了一个线程,而不需要对它进行如何干预,CreateThread后直接CloseHandle就行了。
所以CloseHandel(ThreadHandle );
只是关闭了一个线程句柄对象,表示我不再使用该句柄,即不对这个句柄对应的线程做任何干预了。并没有结束线程。
如果你觉得多了一个变量,也可以写为:
CloseHandel(CreateThread(NULL,0,.....));
又如你期望通过匿名管道获得某个进程的输出内容
SECURITY_ATTRIBUTES sa ={sizeof(SECURITY_ATTRIBUTES),NULL,TRUE}; HANDLE hOutputRead,hOutputWrite; if (!CreatePipe(&hOutputRead,&hOutputWrite,&sa,0)) //创建匿名管道 { MessageBox("CreatePipe Failed!","提示",MB_OK | MB_ICONWARNING); return; } STARTUPINFO si; PROCESS_INFORMATION pi;
ZeroMemory(&si,sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); GetStartupInfo(&si); si.hStdError = hOutputWrite; si.hStdOutput = hOutputWrite; //新创建进程的标准输出连在写管道一端 si.wShowWindow = SW_HIDE; //隐藏窗口 si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
char cmdline[200]; CString tmp,stredit2; GetDlgItemText(IDC_EDIT2,stredit2); //获取编辑框中输入的命令行 tmp.Format("cmd /C %s",stredit2); sprintf(cmdline,"%s",tmp);
if (!CreateProcess(NULL,cmdline,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi)) //创建子进程 { MessageBox("CreateProcess Failed!","提示",MB_OK | MB_ICONWARNING); return; }
//一定要关闭管道释放句柄资源,否则程序会卡死 CloseHandle(hOutputWrite);
|
阅读(2920) | 评论(1) | 转发(0) |