• 8785阅读
  • 9回复

QTcpSocket在QThread中运行的问题 [复制链接]

上一主题 下一主题
离线鹰击长空
 

只看楼主 正序阅读 楼主  发表于: 2011-10-12
我写了一个QTcpSocket在QThread中运行的例子,能正常接收数据,但是调用doWrite函数发送数据时,提示“QSocketNotifier: socket notifiers cannot be enabled from another thread”,跪求高手解惑,跪求啊,急
  1. main.cpp
  2. #include <QApplication>
  3. #include "core.h"
  4. int main(int argc,char *argv[])
  5. {
  6. QApplication app(argc,argv);
  7. CORE coree;
  8. return app.exec();
  9. }


  1. core.h
  2. #ifndef CORE_H
  3. #define CORE_H
  4. #include <QObject>
  5. #include <tcp.h>
  6. #include <QTimer>
  7. class CORE:public QObject
  8. {
  9. Q_OBJECT
  10. public:
  11. CORE(QObject *parent=0);
  12. private slots:
  13. void CycleWrite();
  14. void StartWrite();
  15. private:
  16. tcp *tcpPtr;
  17. QTimer *timer;
  18. };
  19. #endif // CORE_H


  1. core.cpp
  2. #include "core.h"
  3. #include <QDebug>
  4. CORE::CORE(QObject *parent):QObject(parent)
  5. {
  6. tcpPtr=new tcp;
  7. tcpPtr->start();
  8. timer=new QTimer;
  9. connect(timer,SIGNAL(timeout()),this,SLOT(CycleWrite()));
  10. connect(tcpPtr,SIGNAL(connectSucc()),this,SLOT(StartWrite()));
  11. }
  12. void CORE::CycleWrite()
  13. {
  14. tcpPtr->doWrite(QString("111"));
  15. }
  16. void CORE::StartWrite()
  17. {
  18. timer->start(5000);
  19. }


  1. tcp.h
  2. #ifndef TCP_H
  3. #define TCP_H
  4. #include <QThread>
  5. #include <QTcpSocket>
  6. #include <QTimer>
  7. class tcp:public QThread
  8. {
  9. Q_OBJECT
  10. public:
  11. tcp(QObject *parent=0);
  12. signals:
  13. void connectSucc();
  14. public slots:
  15. void doWrite(QString str);
  16. protected:
  17. void run();
  18. private:
  19. QTcpSocket *tcps;
  20. };
  21. #endif // TCP_H


  1. tcp.cpp
  2. #include "tcp.h"
  3. #include <QDebug>
  4. tcp::tcp(QObject *parent):QThread(parent)
  5. {
  6. }
  7. void tcp::doWrite(QString str)
  8. {
  9. tcps->write(str.toLocal8Bit(),str.length());
  10. }
  11. void tcp::run()
  12. {
  13. tcps=new QTcpSocket(0);
  14. tcps->connectToHost("192.168.1.18",6000);
  15. connect(tcps,SIGNAL(connected()),this,SIGNAL(connectSucc()));
  16. exec();
  17. }


离线wujianhui

只看该作者 9楼 发表于: 2011-12-23
接收可以,发送还是很苦恼啊
离线鹰击长空

只看该作者 8楼 发表于: 2011-10-19
回 6楼(ifantasy) 的帖子
我写的通讯都没用QDataStream,服务端就是一个简单的监听
离线鹰击长空

只看该作者 7楼 发表于: 2011-10-19
回 5楼(咖啡猫大人) 的帖子
让QTcpSocket在QThread中可以正常收发数据,就算解决了,现在可以收,发的时候就提示那个错误,发不出去
离线ifantasy
只看该作者 6楼 发表于: 2011-10-18
向服务器端发送数据要用到QDataStream吧,还有你服务器端程序是怎么写的?

只看该作者 5楼 发表于: 2011-10-17
Re:回 1楼(咖啡猫大人) 的帖子
引用第3楼鹰击长空于2011-10-17 11:40发表的 回 1楼(咖啡猫大人) 的帖子 :
是啊,跪求各种解决方案,各种,有木有啊

你要怎么解决?
离线鹰击长空

只看该作者 4楼 发表于: 2011-10-17
回 2楼(oscarboycn) 的帖子
即使在线程类的私有函数里面调用tcpPtr->doWrite(QString("111"));
也会出现同样的提示
离线鹰击长空

只看该作者 3楼 发表于: 2011-10-17
回 1楼(咖啡猫大人) 的帖子
是啊,跪求各种解决方案,各种,有木有啊
离线oscarboycn

只看该作者 2楼 发表于: 2011-10-13
QTcpSocket在哪个线程创建,就只能在哪个线程使用
你的QTcpSocket是在子线程创建的,但是调用的时候
void CORE::CycleWrite()
{
tcpPtr->doWrite(QString("111"));
}应该是在主线程调用的,所以会警告
http://hi.baidu.com/cyclone/blog/item/a33794ee00acba262cf53442.html
http://blog.csdn.net/dbzhang800/article/details/6554104
http://www.21ic.com
http://bbs.eetop.cn
http://www.eetop.cn/
http://www.eet-china.com/
http://www.netyi.net/
http://www.pcbbbs.com/
http://www.pcbtech.net/

只看该作者 1楼 发表于: 2011-10-12
... 你是两个论坛都注册了么...
快速回复
限100 字节
 
上一个 下一个