hur.cn - 华软网

 热门搜索

invalidate UpdateWindow 和状态的SetText发生死锁了,求解决办法

  作者:未知    来源:网络    更新时间:2011/9/24
问题如下:
    一个线程用于显示图像,在这个线程中调用了回调函数,该回调函数使用了MFC的Picture显示图像,在显示图像时使用invalidate  刷新窗口,而该回调函数里面又用了状态栏,用于显示图像的信息,即调用了状态栏的SetText函数,这时发生死锁了,调试发现死锁在刷新状态栏的SetText函数,该函数不能执行。

    到网上看了,发现线程里面调用GDI,使用invalidate时容易发生死锁,现在寻求解决方法!
---华软 网友回答---
通过消息
---华软网友回复---
用bitblt显示出来

---华软网友回复---
线程中发送自定义消息到UI界面线程,在UI界面线程中的自定义消息响应函数中去更新
---华软网友回复---
楼上说的对,如果你初步了解过C#就会发现,C#利用事件和委托最终都是让各个分线程对UI数据的操作让UI线程来处理了。分线程不会对UI数据直接进行操作的。这样就保证了同步。
所以你可以利用自定义消息,对所有UI数据的操作都通过消息响应让UI线程来处理UI数据的更新。使用的时候注意SendMessage和PostMessage的使用
---华软网友回复---
呵呵,我用的回调函数,因为我用的库和UI不是同一个文件, 回调函数是在UI调用的库中定义的,回调函数最后调用MFC 里面的东西显示图像,显示完图像后更新参数,难道更新参数再用一个PostMessage消息,处理更新参数的函数吗,感觉逻辑有问题!
---华软网友回复---
我就是使用的类似函数!
引用 1 楼 heksn 的回复:
通过消息

---华软网友回复---
对于你说的我没太明白,不过很直白的一个道理就是,如果UI数据处理你放在同一个线程中(UI线程),怎么会发生死锁呢?除非你加锁有问题。
一个线程中处理所有数据,数据都是同步的,也就不需要使用到锁了,这就是解决问题的根本方案。
对于你回调函数在哪里定义的,这没有关系啊,关键你处理任务的时候,线程如何划分任务。
---华软网友回复---
引用 7 楼 wjh173069597 的回复:
对于你说的我没太明白,不过很直白的一个道理就是,如果UI数据处理你放在同一个线程中(UI线程),怎么会发生死锁呢?除非你加锁有问题。
一个线程中处理所有数据,数据都是同步的,也就不需要使用到锁了,这就是解决问题的根本方案。
对于你回调函数在哪里定义的,这没有关系啊,关键你处理任务的时候,线程如何划分任务。


呵呵,一直运行没有问题,但是我要切换模式,相机你知道吧有视频模式,就是这么一直跑,然后有抓拍模式,这样切换有问题,因为显示图像和更新参数,他们都是用的同样的函数;
回调函数是一个静态的函数,然后我在静态函数中想用PostMessage ,将更新参数的函数定义为PossMessage的消息函数,那么窗口的句柄怎么传呢,还有PostMessage 后面的2个参数我没有,传0或NULL可以吗;
---华软网友回复---
你意思是说,你写的程序是用WindowsAPI直接实现框架,只是显示图像这块有用到MFC框架中的东西而已,回调函数由你自己实现,现在的问题是你需要更新状态栏中关于图像的属性参数,而你利用SetText来完成状态栏显示文字的更新?
SetText不是MFC框架中的东西么,WindowsAPI没有这个函数吧?还是没太明白你的框架

关于你说的GDI死锁问题你放在分线程有问题的话,可以放到UI线程中处理。
PostMessage如果调用的目标窗口回调函数就是PostMessage所在的回调函数要小心死循环问题。消息是你自定义的,后两个参数你自己定,只要响应的处理函数能够利用这些参数实现相应功能就行了。回调函数都你自己写的。该怎么处理就怎么处理。
---华软网友回复---
引用 8 楼 smilestone322 的回复:
引用 7 楼 wjh173069597 的回复:
对于你说的我没太明白,不过很直白的一个道理就是,如果UI数据处理你放在同一个线程中(UI线程),怎么会发生死锁呢?除非你加锁有问题。
一个线程中处理所有数据,数据都是同步的,也就不需要使用到锁了,这就是解决问题的根本方案。
对于你回调函数在哪里定义的,这没有关系啊,关键你处理任务的时候,线程如何划分任务。


呵呵,一直运行没有问题,但……


thank you !
已经解决了,通过PostMessage
---华软网友回复---
强。。。。。。。      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。