CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
花落谁家,你作主! 盛大widget设计大赛英雄榜
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  基础类

Un1有人找!

楼主jiang1()2000-03-16 17:06:00 在 VB / 基础类 提问

请问Un1:  
          vb中如何获得一个事件的句柄?是否用openevent这样的api函数,如何使用?  
   
          另外vb中waitforsingleobject这个函数的用法如何,我想用它来等待一个事件的触发,直至超时为止,但我没有调试出来,请教各位的高见!!!  
   
  问候大家!  
   
  jiang1   3.16   2000    
  问题点数:50、回复次数:4Top

1 楼Un1()回复于 2000-03-16 17:18:00 得分 50

这是我的RS232编程部分源码,你参考一下:  
   
  Private   Declare   Function   CreateEvent   Lib   "kernel32"   Alias   "CreateEventA"   (ByVal   lpEventAttributes   As   Long,   ByVal   bManualReset   As   Long,   ByVal   bInitialState   As   Long,   ByVal   lpName   As   String)   As   Long  
  Private   Declare   Function   WaitForSingleObject   Lib   "kernel32"   (ByVal   hHandle   As   Long,   ByVal   dwMilliseconds   As   Long)   As   Long  
   
   
  ......  
   
          Dim   l   As   Long  
          l   =   CreateEvent(0,   True,   False,   0)  
          If   l   Then  
                  olpRead.hEvent   =   l  
           
                  l   =   CreateEvent(0,   True,   False,   0)  
                  If   l   Then  
                          olpWrite.hEvent   =   l  
                           
                          l   =   CreateEvent(0,   True,   False,   0)  
                          If   l   Then  
                                  olpEvents.hEvent   =   l  
                          Else  
                                  CloseHandle   olpWrite.hEvent  
                                  GoTo   LError1  
                          End   If  
                  Else  
                   
  LError1:  
                          CloseHandle   olpRead.hEvent  
                          GoTo   LError  
                  End   If  
          Else  
  LError:  
                  Err.Raise   vbObjectError   +   ERR_CREATEEVENT,   MYNAME,   "不能创建事件。"  
          End   If  
           
  ......  
   
   
  ......  
   
  Private   Sub   ReadLoop(ByVal   WaitTime   As   Long)  
          Dim   l   As   Long  
           
          If   blnRead   Then  
                  If   WaitForSingleObject(olpRead.hEvent,   WaitTime)   <>   WAIT_TIMEOUT   Then  
                          blnRead   =   False  
                          l   =   olpRead.InternalHigh  
                          GoTo   ReadComplated  
                  End   If  
          Else  
                  Static   b(32766)   As   Byte  
                  If   ReadFile(m_CommID,   b(0),   m_InBufferSize,   l,   olpRead)   Then   '  
   
  ReadComplated:  
                          If   l   >   0   Then  
                                  strIn   =   strIn   &   LeftB$(b(),   l)  
                                   
                                  m_CommEvent   =   comEvReceive  
                                  RaiseEvent   OnComm  
                          End   If  
                  Else  
                          If   Err.LastDllError   =   ERROR_IO_PENDING   Then  
                                  blnRead   =   True  
                                  olpRead.InternalHigh   =   0  
                          Else  
                                  m_CommEvent   =   comEventDCB  
                                  RaiseEvent   OnComm  
                          End   If  
                  End   If  
          End   If  
  End   Sub  
   
  ......  
   
  Top

2 楼jiang1()回复于 2000-03-17 10:12:00 得分 0

        可否将这个例子改一改,直接按F5键就能轻松运行!实在是   不好意思啦!帮个忙啦!太贪心了是不是???  
   
          另外想问一下:若在窗体上放一个text控件,是否可以得到text_keydown事件的句柄;  
          我现在做的程序中的问题我解释一下:就是电话的拨号,通话和挂机.为了保持通话一定的时间,比如15秒,我采用windows   api函数sleep(15000),不过这样的话,若在sleep的中途,对方非正常挂机,由于我还在sleep状态,就不能触发我的calldisconnect事件,因此也就不会去执行在该事件中的相应代码.这样就会产生错误.看是否除了用waitforsingleobject   function外能够用别的函数或方法即可以保持15秒时间,而程序又不会处于休眠状态,即程序中的任何事件都可以响应windows消息!  
   
   
   
   
  Top

3 楼Un1()回复于 2000-03-17 11:38:00 得分 0

        噢,Sorry!   这只是很多程序中的一个片段,无法简单改写运行。  
   
          我想你可能把   Windows   中的   EventObject   和   VB   中的   Event   搞混淆了,它们是截然不同的概念。前者可认为是一个简单意义上的类似   VB   的   Type   类型,创建它后在异步操作中使用。我个人认为它等效于定时检查加DoEvents,满足条件后标记并返回。而后者是通过标准   COM   接口由内向外的一个过程调用,实际上是对象事件接口的一个方法而已。你可以通过在对象浏览器中选中“显示隐含成员”清楚地看到这一点。  
   
          我认为你把你的问题复杂化了,你可以简单地增加一个定时器,一旦时间超过十五秒,就触发自己的超时事件。另外,如果你是在用Modem编程,我建议使用RAS,   这样可以不去理会这些问题,集中精力解决你真正需要解决的问题。Top

4 楼jiang1()回复于 2000-03-17 15:52:00 得分 0

 
   
          你认为我把我的问题复杂化了,你认为可以简单地增加一个定时器,一旦时间超过十五秒,就触发自己的超时事件。可是我现在编写的程序一个进程中会有30-120个线程,若加定时器会出现意想不到的情况发生,请帮助想一个更好的方法!  
   
  Top

相关问题

  • 码码兄 码码兄 有人找你
  • 秀秀M(宝瓶),也有人找你
  • 有 人 找 我 做 Flash 家 教...
  • 找女友,有人愿意跟我吗
  • 想找人聊聊天,有人来么?
  • ice_cream(冰淇淋)请到总台来一下,有人找。
  • 寻找控件?有没有人用过FastReport这个控件。
  • 这个问题好象有人问过,我找不到拉。
  • 有人能找出这段程序的问题吗???可加分@@@
  • 有人认识小反吗?告诉她我在找她。

关键词

  • 函数
  • sleep
  • vb
  • olpread
  • blnread
  • createevent
  • 事件
  • 触发
  • 定时器
  • hevent

得分解答快速导航

  • 帖主:jiang1
  • Un1

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo