• 7947阅读
  • 4回复

新手求助:多线程中信号、槽和隐含共享的问题 [复制链接]

上一主题 下一主题
离线zooood
 
只看楼主 倒序阅读 楼主  发表于: 2010-11-09
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
前提是这样的:
假设有一个继承自QTread的类A,主线程中通过执行A.start()来启动这个次线程(暂且叫它ThreadA好了)
然后:
如果ThreadA中发射了一个信号,接收这个信号的槽是另外一个类B的某个公有槽B.slotxx(),
那么这个槽的代码是在ThreadA中执行的吗?亦或是ThreadA把信号发出去后就不管了,继续干自己的事,而在主线程中执行B.slotxx()的代码?
另外,假如B.slotxx()这个槽中发生了阻塞(譬如槽要访问B类的某个成员,但这个成员被mutex.lock()了),ThreadA会被阻塞掉吗?

在学多线程的时候,我感觉隐含共享在这里似乎也起作用,就是,如果信号和槽的参数是隐含共享的,那发信号的线程就能立马返回而不用等槽执行完;
相反若没隐含共享,发信号的线程要等槽函数return后才能做下面的事情,如果槽中断了,发信号的线程也会挂起。我碰到过一两个例子但有不能确定,
不知道是不是这样?
离线dbzhang800

只看该作者 1楼 发表于: 2010-11-09
B.slotxx() 是在 B 对象所在线程(而不是B管理的线程)被执行的。如果你的B是在主线程创建的,那么你的B.slotxx 将在主线程被执行。



http://hi.baidu.com/cyclone/blog/item/65f3f603294f2e783812bb51.html
http://hi.baidu.com/cyclone/blog/item/a33794ee00acba262cf53442.html
离线zooood
只看该作者 2楼 发表于: 2010-11-09
引用第1楼dbzhang800于2010-11-09 08:38发表的  :
B.slotxx() 是在 B 对象所在线程(而不是B管理的线程)被执行的。如果你的B是在主线程创建的,那么你的B.slotxx 将在主线程被执行。
http://hi.baidu.com/cyclone/blog/item/65f3f603294f2e783812bb51.html
.......

谢谢热心人点拨,大致弄懂了
离线lejcey

只看该作者 3楼 发表于: 2011-01-21
2L正确,静态函数除外。
离线梦之追风

只看该作者 4楼 发表于: 2011-02-24
煲音
快速回复
限100 字节
 
上一个 下一个