- 主题:请教socket编程如何保证响应的时效性
啊,是我没仔细看贴
也就是当线程A处理数据时,信号又被重设了
如果只是单线程,这个重设的动作不可能发生
经典的用锁的情况,进入之前锁住,出去之后放掉 --- 只是不知道这里应该怎么做
【 在 hengcuiyuan 的大作中提到: 】
: 问题找到了,就是卡在readyRead的槽函数里面,当在槽函数里面执行的时候,有新数据到来,但这个新数据并不会再次有readyRead信号发出,后面的数据接收和处理程序就一直在傻等数据到齐,因而导致的通信超时。多线程的时候这种概率大,不搞多线程的时候没问题。
:
--
FROM 52.9.227.*
你在工作线程中接收readyRead信号本质上也是阻塞模式,没有区别的。没有数据时,你的工作线程不也停在那吗?难道你的工作线程还能干别的?
【 在 hengcuiyuan 的大作中提到: 】
: 这是阻塞模式吧,我想用非阻塞模式。
:
--
FROM 120.244.156.*
肯定能干别的,要不然为什么搞多线程呀。比如我因为某个事务请求一次数据,那我不用傻等这个数据到来呀,我丢给数据处理线程等数据。然后我做其他事情,再请求一次或多次数据,请求完了都丢给数据处理线程。一旦某次请求的数据获得了,我就做相应的后续处理。这不就是要做多线程程序的原因嘛
【 在 dormouseBHU 的大作中提到: 】
: 你在工作线程中接收readyRead信号本质上也是阻塞模式,没有区别的。没有数据时,你的工作线程不也停在那吗?难道你的工作线程还能干别的?
: :
--
FROM 113.70.90.*
我的数据包里面没有序列号的(数据包的定义不是我定义的),如果是多线程程序,不能确保请求的数据按先后次序依次到来,即便是依次序到来的,如果有两次请求的数据夹杂在一起,我也无法哪个数据对应哪次请求。所以定时收数据的方式是不可行的。
【 在 roy 的大作中提到: 】
: 和同步异步有啥关系?在别的线程里用qtimer自动定时触发readReady对应的slot又不是什么难事
:
--
FROM 113.70.90.*
qt说他是多线程的,^_^
【 在 hgoldfish 的大作中提到: 】
: Qt 的 socket 模型是单线程的话,,你用多线程通常就错了。
:
--
FROM 113.70.90.*
你这是没搞懂多线程该怎么用。。。
网络数据读取和解析应该放到一个通讯线程中,用阻塞模式。在这个线程中收到并解析出一个完整的命令后,发送个信号(比如名叫 commandReady 或者 dataPackReady)给真正干活的线程。
简单的说就是不要让你干活的线程接收 readyRead 这么底层的信号,而是接收 commandReady 这样的高层的信号。
从任务划分的角度来说,接收通讯数据和解析通讯数据 这两个是应该在一个线程中的。使用数据应该在另外的工作线程。你现在肯定是把接收数据和使用数据放到同一个线程里了。所以你才会觉得不能用阻塞模式。
【 在 hengcuiyuan 的大作中提到: 】
: 肯定能干别的,要不然为什么搞多线程呀。比如我因为某个事务请求一次数据,那我不用傻等这个数据到来呀,我丢给数据处理线程等数据。然后我做其他事情,再请求一次或多次数据,请求完了都丢给数据处理线程。一旦某次请求的数据获得了,我就做相应的后续处理。这不就是要做多线程程序的原因嘛
:
--
修改:dormouseBHU FROM 120.244.156.*
FROM 120.244.156.*
你可以把不同的 socket 放在不同的线程里面,但是 Qt 是不允许一个 socket 供多个线程使用的。
【 在 hengcuiyuan 的大作中提到: 】
: qt说他是多线程的,^_^
--
FROM 125.78.66.*
感谢老大给的积分。
【 在 hgoldfish 的大作中提到: 】
: 你可以把不同的 socket 放在不同的线程里面,但是 Qt 是不允许一个 socket 供多个线程使用的。
:
--
FROM 120.244.156.*
高手,我搞半年没搞定!现在彻底放弃了readyReady信号,好了,隔5ms读一次,再也不乱了,哈哈
【 在 roy 的大作中提到: 】
: 和同步异步有啥关系?在别的线程里用qtimer自动定时触发readReady对应的slot又不是什么难事
:
--
FROM 113.70.89.*
你发送的是udp吧
用tcp就不会这样了
【 在 hengcuiyuan 的大作中提到: 】
: 我是用来做工业应用程序的,对时效性要求高。代码的问题应该是有,我发现两次通信之间人为的加入200ms(用的是processEvents)的延时,通信的可靠性就好了,基本不会有几秒钟,甚至十几秒都读不到数据的情况(qt4可以,qt5编译的程序也有问题)。
: PS:我的通信代码是放在另一个线程里面的,也同样放了延时,但是延时的时间却不能长,长了也会有十几秒读不到数据的情况。
--
FROM 111.199.185.*