关于线程句柄的问题,难者不会,会者不难,100分,在线等待...
关于bcb的线程使用:
我新建一个工程,然后,开一个新线程,线程里面什么都不做,就循环10000次的加操作,线程的FreeOnTerminate是True;
按照bcb的说法,这个线程自己执行完毕后是可以自动销毁的,我在主窗体中新开了10个线程,把线程对象指针放入一个数组中.
现在有几个问题
1.线程结束后,存放在数组中的对象指针依然是没有变化的,线程的handle也没有变化
2.查看windows的进程管理器,发现这个程序多出了10个handles对象,即使线程运行完毕后,10个handle对象依然存在,也就是说,存在内存的泄露问题.
3.既然线程结束后,线程的handle依然没有变化,那么论坛上的一些例子说可以用WaiteForSingelObject(handle,....)来等待线程运行完毕,不是永远都等待在那里了吗?
程序如下:
//主窗体代码
//---------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h "
#include "Unit2.h "
//---------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm "
TForm1 *Form1;
tt* arr[10];
//---------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
for(int i=0;i <10;i++)
{
arr[i]=NULL;
}
}
//---------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
for(int i=0;i <10;i++)
{
tt *thread=new tt(false);
arr[i]=thread;
int q=arr[0]-> Handle;
}
}
//---------------------------------------
void __fastcall TForm1::btn1Click(TObject *Sender)
{
mmo1-> Lines-> Clear();
for(int i=0;i <10;i++)
{
AnsiString str;
str=IntToStr(i)+ ": handle : "+IntToStr(arr[i]-> Handle)+ "对象: "+IntToStr((int)arr[i]);
mmo1-> Lines-> Add(str);
}
}
//---------------------------------------
//线程代码
__fastcall tt::tt(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
//---------------------------------------
void __fastcall tt::Execute()
{
for(int i=0;i <100000;i++) int q=0;
}
//---------------------------------------
[解决办法]
需要CloseHandle的
[解决办法]
他等待的不是这个句柄本身的值,而是该线程对象中的项