我用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文件,我们怎么样等文件生成后再判断?

解决方案 »

  1.   

    FindFile的路径是否设置正确了
      

  2.   

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

  3.   

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

  4.   

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

  5.   

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

  6.   

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

  7.   

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

  8.   

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

  9.   

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

  10.   

    可能SendMessage没有接收到返回
      

  11.   

    ....
    ....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.”
    怎么办呢?
      

  12.   

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

  13.   

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

  14.   

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

  15.   

    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
    );
      

  16.   


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