• 3870阅读
  • 4回复

QTCP多线程问题 [复制链接]

上一主题 下一主题
离线wenson1
 

只看楼主 倒序阅读 楼主  发表于: 2013-07-04
<DIV id=read_tpc mb10?>先贴代码
void TERMINAL_THREAD::run(){      
tcpsocket = new QTcpSocket(this);      
if(!tcpsocket->setSocketDescriptor(socketDescriptor))      
{          
qDebug()<<"terminal tcpsocket error";          
return;    
}      
else      
{        
qDebug()<<"terminal tcpsocket ok";    
}    
qDebug()<<socketDescriptor;

     char buff12[1]={0};
   buff12[0]=0x31;    
this->tcpsocket->write(buff12,1);
    terminal_ip=tcpsocket->peerAddress().toString();    
qDebug()<<"ip"<<terminal_ip;    
      connect(tcpsocket,SIGNAL(readyRead()),this,SLOT(read_tcp()),Qt::DirectConnection);      
connect(w,SIGNAL(read_server_sig(QString,QString)),this,SLOT(read_server_slot(QString,QString)));      
connect(tcpsocket,SIGNAL(disconnected()),this,SLOT(close_connect()));      
connect(tcpsocket,SIGNAL(readChannelFinished()),this,SLOT(close_connect()));    
//connect(w,SIGNAL(write(QString)),this,SLOT(write_tcp(QString)),Qt::DirectConnection);    
// connect(send_write,SIGNAL(write_send(QString)),this,SLOT(write_tcp(QString)),Qt::DirectConnection);      
connect(this,SIGNAL(write(QString)),this,SLOT(write_slot(QString)),Qt::DirectConnection);      
exec();}
void TERMINAL_THREAD::write_slot(QString str){    
tcpsocket->write(str.toLocal8Bit(),str.length());}
TERMINAL_THREAD::~TERMINAL_THREAD()
{  
this->tcpsocket->deleteLater();
}
void TERMINAL_THREAD::close_connect(){
    this->exit();    
this->terminate();
}
void TERMINAL_THREAD::read_server_slot(QString tcp_ip, QString read_string)
{  
QString write_data="["+tcp_ip+"]"+read_string;    
this->tcpsocket->write(write_data.toLocal8Bit(),
write_data.length());
}
void TERMINAL_THREAD::write_tcp(QString str){  
write_string=str;    
istcpsock=true;  
this->tcpsocket->write(str.toLocal8Bit(),str.length());
}
void TERMINAL_THREAD::read_tcp(){  
QString read_string,ip_tcp;    
read_string=this->tcpsocket->readAll();  
QTcpSocket *tcpsock2 = tcpsocket;    
emit sig_read_tcp(tcpsocket->peerAddress().toString(),read_string);
}

在主线程里面发一个信号调用write_tcp,报QSocketNotifier: socket notifiers cannot be enabled from another thread

请问大神如何解决

离线vector
只看该作者 1楼 发表于: 2013-07-04
在构造函数中加上 moveToThread(this);试试
离线wenson1

只看该作者 2楼 发表于: 2013-07-05
效果一样,问题很明显,就是想不到办法解决
离线rozendew

只看该作者 3楼 发表于: 2013-07-06
connect(send_write,SIGNAL(write_send(QString)),this,SLOT(write_tcp(QString)),Qt::DirectConnection);
这个放到主线程里进行连接。
你现在的写法是错的。
如果采用二楼的,就要把RUN里的改到类里去,在类创建后再从创建线程中移到另一个线程。
而且你主要是从主线程发送信号,那么绑定最好是在主线程绑定。
我只是知道我所知道的
离线wenson1

只看该作者 4楼 发表于: 2013-07-06
我等等试试,现在我解决是重写了Qtcpsocket,在run下面new一个,要发的数据直接传到tcpsocket下再发,这个倒行的通
快速回复
限100 字节
 
上一个 下一个