请教线程与socket的问题!!!!
我在线程里用QTcpSocket连服务器
void CRealDataThread::run()
{
QTcpSocket hTcpSocket;
connect(&hTcpSocket, SIGNAL(readyRead()), this, SLOT(OnReadyRead()));
......
exec();
}
然后在onreadyread信号里处理数据
void CRealDataThread::OnReadyRead()
{
QTcpSocket* pSocket = qobject_cast<QTcpSocket*>(sender());
Q_ASSERT(pSocket != NULL);
......
pSocket->write((const char*)&commHead, sizeof(commHead));
结果就说:
QSocketNotifier: socket notifiers cannot be enabled from another thread
谁知道为什么?
接收没事,发送就说跨线程?
如果改成:
connect(&hTcpSocket, SIGNAL(readyRead()), this, SLOT(OnReadyRead()), Qt::DirectConnection);
那么
QTcpSocket* pSocket = qobject_cast<QTcpSocket*>(sender());
Q_ASSERT(pSocket != NULL);
这个断言就会报错!
奇怪啊,在run里面实例化的变量,应该就在子线程空间吧?OnReadyRead()也应该是子线程调用的?
如果改成:
void CRealDataThread::run()
{
m_pTcpSocket = new QTcpSocket();
connect(m_pTcpSocket, SIGNAL(readyRead()), this, SLOT(OnReadyRead()), Qt::DirectConnection);
....
void CRealDataThread::OnReadyRead()
{
QTcpSocket* pSocket = m_pTcpSocket;//qobject_cast<QTcpSocket*>(sender());
这样就不会有错。。。奇怪呢
我看到QT好几个例子都是在run函数阻塞的方式调用QTcpSocket,难道在线程里就没有办法用QTcpSocket的消息循环?
[ 此帖被reback在2010-03-24 11:27重新编辑 ]