在线等待,关于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,还是双管齐下?
...全文
412 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
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()也没有内存泄漏啊?

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧