• 16445阅读
  • 14回复

从主线程发送信号给子线程,子线程里的connect函数怎么个写法???(修改) [复制链接]

上一主题 下一主题
离线succulent
 
只看楼主 倒序阅读 楼主  发表于: 2008-11-19
— 本帖被 XChinux 执行加亮操作(2008-11-30) —
在主线程里设置一个按钮,一按下去,就向某特定的子线程发送信号,该子线程与某特定IP地址的客户端相连,根据socketDescriptor可以把各子线程区分开来??这个值始终不会改变
请问QT里有其他成熟的机制可实现这个功能吗,
[ 此贴被succulent在2008-11-19 15:57重新编辑 ]
离线vrcats
只看该作者 1楼 发表于: 2008-11-19
每个线程创建的时候都保留个指针就可以了,也可以用thread id来区分
离线succulent
只看该作者 2楼 发表于: 2008-11-19
发现这真的是个大问题
比如主线程界面创建一个button,按下去后发送一个信号click(),信号发给了子线程1,但是,怎么找到这个线程呢,button按下去,只能发送一个信号click,没法添加别的参数啊
离线succulent
只看该作者 3楼 发表于: 2008-11-19
是否可以这样,click以后,就发送一个信号到this的一个自定义slot中,在这个slot里,定义好要控制的子线程的标志号,并再发送一个信号到相应的子线程!那样就解决了
离线vrcats
只看该作者 4楼 发表于: 2008-11-19
好像只有这个办法,Qt本身不提供Thread等级的Dispatcher,只能自己维护一个了
离线water_wf

只看该作者 5楼 发表于: 2008-11-19
那看你怎么把button和thread联系起来的,怎么发就行了
离线succulent
只看该作者 6楼 发表于: 2008-11-19
连接到最后出了个问题
我在子线程类里定义了slot recdown
然后在构造函数中写了
connect(MainWindowImpl, SIGNAL(tothread(QString)), this, SLOT(recdown(QString)));
其中MainWindowImpl就是主线程类,从它那里发出了个tothread信号,这个信号里包含着所要控制的子线程的标志信息,可以是IP地址,也可以是独一无二的参数等等。
但问题是,在子线程中,并没有主线程的实例,所以,这句话肯定是语法错误的,用什么来替代MainWindowImpl才能编译通过呢
离线water_wf

只看该作者 7楼 发表于: 2008-11-19
你肯定有一个thread  list来管理创建的thread的对不对,如果没有,&&^^#$#%%
,在创建的地方链接即可,如果在dialog中创建的,可以先链接到dialog上,在dialog链接到mainwindow上,麻烦一步而已,当然也可以一步到位
slot/signal就是一种通信方法(更方便写),而且qt4是线程安全的,可以多级连的connect(,signal(**),,signal(**)),具体看你的设计
离线water_wf

只看该作者 8楼 发表于: 2008-11-19
或者直接链接到thread list 的管理器(类似线程池管理器),然后它来负责告诉那个thread来相应这个消息
离线succulent
只看该作者 9楼 发表于: 2008-11-19
呵呵,我没有thread list这个东东,我搜搜去,不懂的地方还很多,qt自带的example里也没有出现

目前signal已经可以发出来了,问题出在我不知道该怎么在thread里进行接收,thread里定义个slot也没问题
但connect的时候,比如connect(XXX,signal,this,slot)
前面这个XXX我不知道如何写了,比如信号是从类A里面发送的,那么我是否就该在thread里 A  aaa;然后XXX=aaa

或者用你所说的thread list可以解决这个问题?我先学习一下,谢谢
离线succulent
只看该作者 10楼 发表于: 2008-11-19
哎,是我自己糊涂了,原来跟从子线程到线程是一样的道理,逐级跳
离线evoleci
只看该作者 11楼 发表于: 2008-12-10
succulent你好,
我遇到了和你一样的问题,就是在子线程中接收信号并响应的时候connect(XXX,signal,this,slot),XXX那个地方不知道如果填写,就是不知道如果识别主线程的ID,请指教!
谢谢
我们只是在经历着一些事情。
离线succulent
只看该作者 12楼 发表于: 2008-12-10
我的connect是写在定义子线程变量的程序段中
比如,我在a.cpp中QThread thread
那么,就connect(this,SIGNAL,thread,SLOT);
离线evoleci
只看该作者 13楼 发表于: 2008-12-12
TO  succulent :

呵呵,谢谢,把自己绕到死胡同里去了 ,狂汗

PS:这两天系统挂掉了,才上来看到,非常感谢
我们只是在经历着一些事情。
离线jwqacqy
只看该作者 14楼 发表于: 2010-08-12
反过来想就行了    
connect(this, SIGNAL(change_bri(int)),&thread, SLOT(bri_slot(int)));
其中this是主线程的  change_bri(int) 是主线程的信号   ,&thread,是子线程的ID   bri_slot(int)是子线程的slot
快速回复
限100 字节
 
上一个 下一个