- 主题:请教socket编程如何保证响应的时效性
你是没有理解该怎么用 while。readyRead 里当然是不能用 processEvent 的。
while(data = xxx.readAll(), !data.isEmpty() )
{
doSomething(data);
}
【 在 hengcuiyuan 的大作中提到: 】
: 用while我也想过,这就要设置超时,我看手册上又说响应readyRead信号的槽函数里面不能用processEvent,这个超时又该如何设置呢?我又怎么知道什么时候所有信息读完了呢?
:
--
FROM 120.244.156.*
还有一个问题。既然读取网络数据不在主线程中,就不应该用readyRead,而是应该用 waitForReadyRead。
Qt 文档写的很清楚:
This function can operate without an event loop. It is useful when writing non-GUI applications and when performing I/O operations in a non-GUI thread.
【 在 hengcuiyuan 的大作中提到: 】
: qt搞通信是有点难度。研究了一下,可能是readyRead信号的触发问题,我是多线程环境,如果readyRead信号触发了槽函数的执行,而在槽函数未执行完时,又有新的数据到来,好像不会再触发readRead信号,然后我就永远无法读到那后半部分到来的数据了,然后程序就会报通信超时。
:
--
修改:dormouseBHU FROM 120.244.156.*
FROM 120.244.156.*
你在工作线程中接收readyRead信号本质上也是阻塞模式,没有区别的。没有数据时,你的工作线程不也停在那吗?难道你的工作线程还能干别的?
【 在 hengcuiyuan 的大作中提到: 】
: 这是阻塞模式吧,我想用非阻塞模式。
:
--
FROM 120.244.156.*
你这是没搞懂多线程该怎么用。。。
网络数据读取和解析应该放到一个通讯线程中,用阻塞模式。在这个线程中收到并解析出一个完整的命令后,发送个信号(比如名叫 commandReady 或者 dataPackReady)给真正干活的线程。
简单的说就是不要让你干活的线程接收 readyRead 这么底层的信号,而是接收 commandReady 这样的高层的信号。
从任务划分的角度来说,接收通讯数据和解析通讯数据 这两个是应该在一个线程中的。使用数据应该在另外的工作线程。你现在肯定是把接收数据和使用数据放到同一个线程里了。所以你才会觉得不能用阻塞模式。
【 在 hengcuiyuan 的大作中提到: 】
: 肯定能干别的,要不然为什么搞多线程呀。比如我因为某个事务请求一次数据,那我不用傻等这个数据到来呀,我丢给数据处理线程等数据。然后我做其他事情,再请求一次或多次数据,请求完了都丢给数据处理线程。一旦某次请求的数据获得了,我就做相应的后续处理。这不就是要做多线程程序的原因嘛
:
--
修改:dormouseBHU FROM 120.244.156.*
FROM 120.244.156.*
感谢老大给的积分。
【 在 hgoldfish 的大作中提到: 】
: 你可以把不同的 socket 放在不同的线程里面,但是 Qt 是不允许一个 socket 供多个线程使用的。
:
--
FROM 120.244.156.*