Chinaunix首页 | 论坛 | 博客
  • 博客访问: 35410
  • 博文数量: 5
  • 博客积分: 191
  • 博客等级: 入伍新兵
  • 技术积分: 65
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-21 10:51
文章分类
文章存档

2011年(1)

2010年(2)

2009年(2)

我的朋友

分类: WINDOWS

2010-12-31 11:13:42

很多程序在创建线程都这样写的:

显示代码打印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) |
给主人留下些什么吧!~~

chinaunix网友2011-01-03 16:18:17

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com