CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  进程/线程/DLL

SendMessage的延时问题

楼主pckite(中国青年)2004-11-03 11:51:58 在 VC/MFC / 进程/线程/DLL 提问

我用SendMessage发送消息:  
  LRESULT   lResult=SendMessage(ms->hwnd,BM_CLICK,0,0);  
   
  消息事件处理过程BM_CLICK中程序产生一个test.txt的文件;  
   
  SendMessage完了之后我用  
  if(finder.FindFile("test.txt"))  
  {  
  }  
  来判断test.txt文件是否存在时,都是说不存在,但是打开硬盘目录  
  文件都是存在的。  
  假如事先test.txt已经存在,在SendMessage完了之后判断存在与否时又说存在,这说明  
  SendMessage后并不马上生成test.txt文件,我们怎么样等文件生成后再判断? 问题点数:50、回复次数:21Top

1 楼flyelf(空谷清音)回复于 2004-11-03 12:38:45 得分 3

FindFile的路径是否设置正确了Top

2 楼roger_ding(海天一色)回复于 2004-11-03 13:01:21 得分 3

你的FindFile有问题,仔细检查一下Top

3 楼Atomictry(天影)回复于 2004-11-03 13:03:33 得分 3

SendMessage()是等消息处理完再返回的。   你跟踪试试看。Top

4 楼roger_ding(海天一色)回复于 2004-11-03 13:03:59 得分 5

SendMessage是同步的,一定是在BM_CLICK   CreateFile之后返回,所以文件肯定是被创建了,但是BM_CLICK消息返回时必须CloseHandleTop

5 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2004-11-03 13:05:16 得分 3

估计是因为文件没关闭的原因。Top

6 楼pckite(中国青年)回复于 2004-11-03 14:36:02 得分 0

谢谢各位,从高度过程来看:  
   
  1、FindFile的路径都是正确的。  
  2、SendMessage也确实产生test.txt文件了,并且确实覆盖了原来的文件。  
  3、每次SendMessage的返回值是0 。  
   
  但要是在SendMessage之后FindFile就是不行,除非test.txt文件在SendMessage之前已经存在。  
   
  这是何故?(BM_CLICK消息如何产生文件我们无法知道,因为是调用其它进程的。)Top

7 楼roger_ding(海天一色)回复于 2004-11-03 16:17:43 得分 5

如果你觉得是延迟的问题,那就在if(finder.FindFile("test.txt"))设个断点,运行到那里时,等十分钟再按F10,检查能否查到Top

8 楼danyueer(淡月儿:从此以后,各人得各人的眼泪罢了)回复于 2004-11-03 16:30:53 得分 5

楼主不妨加上一个Sleep(1000)验证一下自己的想法试试。  
   
  不过,我还是觉得是你的FindFile路径设置有问题。Top

9 楼bobob(静思)回复于 2004-11-03 16:34:15 得分 3

我觉得应该不是延迟的问题,没有closehandle可能是有问题  
   
  Top

10 楼pckite(中国青年)回复于 2004-11-03 16:58:54 得分 0

因为是动态链接库,不好调试,我的实验是这样的:  
   
  1、在SendMessage之后,取了系统当时的时间CurTime,运行完了之后,打开硬盘发现test.txt文件创建时间在CurTime之后的两秒,由此可见,当我们SendMessage之后判断文件存在与否时,文件确实没有创建。  
   
  2、Sleep(5000)之后,文件的创建时间也推迟了5秒,充分说明了BM_CLICK的消息事件是在本线程完成之后执行的。  
   
  各位大侠,有什么办法吗?谢谢各位。Top

11 楼roger_ding(海天一色)回复于 2004-11-03 17:01:38 得分 0

把你创建文件的代码贴出来Top

12 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2004-11-03 17:08:11 得分 5

把dll放到调试exe中调试Top

13 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2004-11-03 17:14:55 得分 2

可能SendMessage没有接收到返回Top

14 楼pckite(中国青年)回复于 2004-11-03 17:28:01 得分 0

....  
  ....  
   
  CTime   ct;  
  CFileFind   finder;  
  CString   FileFullName="......";  
   
  //发消息,ms->hwnd是某个按钮的句柄,在BM_CLICK事件里生成一个FileFullName文件  
  LRESULT   SendMsgResult=::SendMessage(ms->hwnd,BM_CLICK,0,0);  
   
  ct=CTime::GetCurrentTime();    
  //看看当时的时间              
  printf("\n   send   time   :%d   ,%d,   %d",ct.GetHour(),ct.GetMinute(),ct.GetSecond());  
   
  if(finder.FindFile(FileFullName))  
  {  
          printf("\n   File   Created.   ");  
  }  
  finder.Close();  
   
  //结果发现FileFullName文件被创建的时间在ct之后的几秒钟,因此没有打印出“File   Created.”  
  怎么办呢?Top

15 楼pckite(中国青年)回复于 2004-11-03 17:29:56 得分 0

SendMessage的返回值SendMsgResult总是0,我们无法知道在BM_CLICK事件里是如何生成FileFullName文件的,我们只知道它的功能是生成这个文件。Top

16 楼liuzq_78(披着羊皮的狼)回复于 2004-11-03 18:11:27 得分 0

关注Top

17 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2004-11-03 18:12:15 得分 3

SendMessage的返回有时收不到(反正我碰到过   ^_^)Top

18 楼pckite(中国青年)回复于 2004-11-04 09:04:43 得分 0

救命啊!!问题还没解决,请大家帮帮忙。Top

19 楼crystal521(【云淡风轻】)回复于 2004-11-04 09:21:39 得分 5

用PostMessage试试  
  在BM_CLICK中创建完成后返回一个事件或向主程序发送一个消息  
  LRESULT   lResult=SendMessage(ms->hwnd,BM_CLICK,0,0);  
  后等待该时间或消息,成功接收后再执行  
  if(finder.FindFile("test.txt"))  
  {  
  }  
   
  Top

20 楼azs()回复于 2004-11-04 11:09:13 得分 5

HANDLE   hChangeHandle   =   FindFirstChangeNotification(  
      lpPathName,         //   directory   name  
      TRUE,         //   monitoring   option  
      FILE_NOTIFY_CHANGE_FILE_NAME   |   //   filter   conditions  
      FILE_NOTIFY_CHANGE_SIZE   |  
      FILE_NOTIFY_CHANGE_LAST_WRITE  
  );  
  if   (!finder.FindFile(FileFullName))  
  {  
      while   (!finder.FindFile(FileFullName))  
    {  
          FindNextChangeNotification(  
              hChangeHandle       //   handle   to   change   notification  
          );  
      }  
  }  
   
  FindCloseChangeNotification(  
      hChangeHandle       //   handle   to   change   notification  
  );Top

21 楼pckite(中国青年)回复于 2004-11-05 08:45:26 得分 0

 
  终于找出昨天的问题所在了,在SendMessage(ms->hwnd,BM_CLICK,0,0)里的BM_CLICK事件消息  
   
  去完成的事件里新建了一个生成文件的线程,所以当SendMessage完成返回后,在BM_CLICK事件  
   
  消息里新建的那个线程并未完成,这就导致我们在SendMessage完成后判断文件是否存在失败,因  
   
  为SendMessage完成后,那个文件生成的线程并未结束,这时文件确实尚未生成。  
   
  另外,好像文件生成线程也是当前主线程的子线程,所以,当我们在当前  
   
  主线程作SLEEP(5000)时,生成文件的子线程也被冻结了,所以我们再怎么等一万年也等不到  
   
  彩虹的出现。  
   
  谢谢各位的热心帮助,发分了,请查收。  
   
  Top

相关问题

  • SendMessage
  • SendMessage
  • SendMessage?
  • SendMessage
  • sendmessage
  • SendMessage什么时候返回?
  • SendMessage()什么时候执行?
  • 当SendMessage与WM_COPYDATA发生矛盾时……………
  • CWnd;sendmessage
  • postmessage & sendmessage

关键词

  • 文件
  • 线程
  • 消息
  • sleep
  • sendmessage
  • bm
  • filefullname
  • 生成
  • findfile
  • finder

得分解答快速导航

  • 帖主:pckite
  • flyelf
  • roger_ding
  • Atomictry
  • roger_ding
  • DentistryDoctor
  • roger_ding
  • danyueer
  • bobob
  • oyljerry
  • oyljerry
  • oyljerry
  • crystal521
  • azs

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

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