SendMessage的延时问题
我用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




