关于ui线程的问题。。。
c++吧
全部回复
仅看楼主
level 13
⑨chu
楼主
我创建了一个线程用来处理一些工作,现在由于需要,这个线程额外维护了一个窗口,所以我想直接通过windows的线程消息队列来通知线程处理事务
问题很简单:这种想法可行吗?效率与event同步或者完成端口比怎么样?
坐等大牛。。
顺带问下setwindowlong等一系列函数是不是线程安全的?
2012年04月11日 14点04分
1
level 12
贴吧用户_0JNJWtE684
可以。消息全部用Post不要Send,否则容易造成死锁。
至于setwindowlong,跨线程的改为自定义消息实现。谁的窗口谁负责,不要跨线程操作。
2012年04月11日 14点04分
2
level 13
⑨chu
楼主
我记得setwindowlong可以操作任意窗口的啊
PS:就你来
挽尊
了
2012年04月11日 14点04分
3
level 12
贴吧用户_0JNJWtE684
手册上没讲这是线程安全的
即使是线程安全的,也要考虑到潜在的死锁问题
比如SendMessage跨线程使用就很容易造成死锁
2012年04月11日 14点04分
4
level 13
⑨chu
楼主
受教
2012年04月11日 14点04分
5
level 13
⑨chu
楼主
为什么send会死锁呢。。
getmessage不是会马上返回么。。
2012年04月11日 14点04分
7
level 12
Hope_20121221_
PeekMessage才是马上返回, GetMessage会等下一个消息...
2012年04月11日 14点04分
9
level 13
⑨chu
楼主
额。。是这样么。。
2012年04月11日 14点04分
10
level 12
贴吧用户_0JNJWtE684
send直接调用消息响应函数,但是在调用之前会等待目标线程的消息队列空闲
如果目标线程恰好又在处理某个消息的过程中等待这个线程,就死锁了,因为它不是空闲状态
2012年04月11日 14点04分
12
level 12
贴吧用户_0JNJWtE684
Windows内置的控件被MFC封装之后清一色的Send
2012年04月11日 14点04分
13
level 1
nt_12
getmessage 会发生阻塞
sendmessage 并不会发生死锁 但是消息没经过WNDProc或者消息到目标直接报废了,Sendmessage会发生永久性阻塞,至于为什么要经过WNDProc是因为需要内核回调,内核回调表在PEB中(指向User32中的一个线性堆中)
2012年04月11日 14点04分
14
level 12
贴吧用户_0JNJWtE684
他是那么说的,但是实际用起来就是死锁
2012年04月11日 15点04分
16
level 1
nt_12
消息第一次进入wndproc是屁都不干的
2012年04月11日 15点04分
17
level 13
⑨chu
楼主
= = 如果我只发送自定义的消息呢,然后在getmessage的时候直接处理掉而不分发这个消息是不是不经过wndproc了?
2012年04月11日 23点04分
18
1