在线等待,关于Event,CloseHandle() Or delete handle !?

explorer007 2002-06-10 11:26:36
各位大虾,Event用过的吗?
一般的方法是
HANDLE h = CreateEvent( , , "TEST");
在需要Wait的地方HANDLE h = OpenEvent( , , "TEST");
WaitForSingleObject(h, );
CloseHandle(h);
在需要Release的地方HANDLE h = OpenEvent( , , "TEST");
SetEvent(h);
CloseHandle(h);
也就是说每次Open后都需要Close; 但是,我试过纪录CreateEvent传回的handle,然后通过这个handle操作好像也可以的.
另外,因为我使用一个HANDLE * hList = new HANDLE[5]来纪录的,所以在退出程序的时候需要delete []hList;但是标准的做法好像是应该CloseHandle()的,但是,这样的做的话,有内存泄漏.反而delete,没有泄漏任何内存.
搞不懂了,到底是应该delete还是CloseHandle,还是双管齐下?
...全文
263 点赞 收藏 19
写回复
19 条回复
explorer007 2002年06月21日
我发现CreateEvent()传回的值都是指向1MB以下的内存单元,也就是说指向的是系统内存单元,我也就不需要额外开辟内存单元去存放了,直接纪录这个地址就OK了,有CPtrList :)
回复 点赞
explorer007 2002年06月18日
顺便问一句,有谁用过libpcap吗?
回复 点赞
daehappy 2002年06月16日
up!关注!
回复 点赞
explorer007 2002年06月16日
试试先
回复 点赞
explorer007 2002年06月14日
UP^
回复 点赞
bflyswh 2002年06月14日
如果你要传送一个handle到另一个线程,如果线程同属一个进程,你要控制handle的关闭,否则可能调用CloseHandle后,另一个线程会出错。如线程不属同一进程最好用DuplicateHandle或OpenEvent打开该handle以增加引用计数。
因为handle涉及到核心对象的内存分配,虽然系统会在你关闭应用程序后自动释放该handle及其拥有的内存。建议你先关闭handle后在释放你自己分配的指向该handle的指针,特别是对于服务端的一些程序。handle和你自己分配的指针拥有这是不同的,要理解这一点。
回复 点赞
colorknight 2002年06月14日
可以,不过你自己记得,不要在一个线程还要使用该HANDLE时,另一个线程掉用了
CLOSEHANDLE,最好在你的主线程创建,并在最后保证其他线程退出后关闭掉它!或者直接不关,让系统释放(仅限于没有被多进程访问的内核对象)。
回复 点赞
colorknight 2002年06月13日
问题是这样的,你按照freelybird(阿愚)所说的做是没有问题的,你在程序中只调用CLOSEHANDLE(),那么你动态分配的内存没释放掉,必然产生内存泄露,如果只调用DELETE,那么系统会在结束时帮你释放掉EVENT,也就是内核对象。我个人认为,如果不是服务器程序,关不关句柄没有太大关系。一般应用程序运行程序时间不是太长,不会有太大影响。另外,CLOSEHANDLE,只是减少句柄的引用记数,当记数为0时,系统释放该资源。当然,记数不止一处,你关闭的只是应用程序的记数。但系统会为你解决一切问题的。
回复 点赞
explorer007 2002年06月13日
我的意思是说,我在一个线程中Create,并纪录传回的Handle,在另一个线程中通过Handle,进行操作。这样可以吗?
回复 点赞
explorer007 2002年06月13日
应该说有没有什么其他的影响,对系统……
回复 点赞
explorer007 2002年06月13日
colorknight(多彩的骑士)说得没错,可是现在我需要知道的是,我在一个线程中Create,并纪录传回的Handle,在另一个线程中通过Handle,进行操作而不通过OpenEvent获得Handle。
这样可以吗?
回复 点赞
chenybin 2002年06月13日
UP算了
回复 点赞
explorer007 2002年06月12日
快来帮我啊
回复 点赞
kenwhale 2002年06月12日
HANDLE h = CreateEvent( , , "TEST"); //创建一个事件内核对象
HANDLE h = OpenEvent( , , "TEST"); //打开一个已存在的内核对象

CloseHandle(h);//关闭一个内核对象,系统释放相关内存,你不关闭进程结束时系统会自动关闭。

waitforsingleobject//等待某个内核对象变为通知状态,event当SetEvent让一个event变为通知状态,RetEvent让它变成未通知状态.
回复 点赞
explorer007 2002年06月11日
哪里有的下载?
回复 点赞
freelybird 2002年06月10日
两者互不相干, 先CloseHandle(..),再delete掉.
CloseHandle是清除你创建的事件句柄. 而delete是清除你new的
内存(这块内存存放的是handle)

for(int loop=0;loop<5;loop++)
{
CloseHandle(hList[loop]);
}
delete[] hList;
回复 点赞
batizhou 2002年06月10日
建议你去看《WIN32多线程程序设计》上面说得很清楚!关于EVENTS等核心对象,一两句也说不清楚。
回复 点赞
explorer007 2002年06月10日
UP
回复 点赞
explorer007 2002年06月10日
为什么不调用CloseHandle()也没有内存泄漏啊?
回复 点赞
发动态
发帖子
VC/MFC
创建于2007-09-28

7901

社区成员

42.1w+

社区内容

VC/MFC相关问题讨论
社区公告
暂无公告