关于Qt子线程中用socket的问题

飞翔的黄瓜 2017-08-25 11:06:57
我的代码是这样的

class MyThread : public QThread
{
Q_OBJECT
public:
//explicit MyThread(QObject *parent = 0);
~MyThread();
public:
MyThread();

protected:
void run();
private:
widgetSec *myptr;
QTcpSocket *ThreadTcp;


public:
QString a;
QTcpSocket *tcp;
int TcpDes;
signals:
void threadEnd();
void deliverInfo();//传递信号

public slots:

};
MyThread::MyThread()
{
connect(this,SIGNAL(finished()),this,SLOT(deleteLater()));
}
MyThread::~MyThread()
{

delete ThreadTcp;我在析构函数中加delete ,信息就会发不出去
}
void MyThread::run()
{//while(1){
ThreadTcp=new QTcpSocket;
ThreadTcp->setSocketDescriptor(TcpDes);
int sign=ThreadTcp->write(a.toLatin1());
qDebug()<<sign;
ThreadTcp->waitForBytesWritten(-1);

bool b=ThreadTcp->flush();

}

如果我在子线程中delete我new的QTcpSocket变量,信息就发不出去了 请问这是为什么
...全文
1149 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Lutx 2017-09-07
  • 打赏
  • 举报
回复
connect语句最后再加一个参数, Qt::DirectConnection 试试看 connect(this,SIGNAL(finished()),this,SLOT(deleteLater()), Qt::DirectConnection);
飞翔的黄瓜 2017-09-06
  • 打赏
  • 举报
回复
引用 11 楼 u014430031 的回复:
http://blog.csdn.net/taiyang1987912/article/details/29271549 关于内存泄漏的总结 我的理解是deleteLater()会析构掉ThreadTcp=new QTcpSocket这个对象 如果我理解错了 请指正
我试过和这个deletelater没关系,是在析构函数中加delete ThreadTcp这句才回发送不出信息,如果不加即使有deletelater也可以正常发送
飞翔的黄瓜 2017-09-02
  • 打赏
  • 举报
回复
引用 10 楼 tony2278 的回复:
delete ThreadTcp;我在析构函数中加delete ,信息就会发不出去 //Question: 在析构函数中 bu 加delete ,信息就会发出去?
是这样的!
橙儿稻香 2017-09-01
  • 打赏
  • 举报
回复
http://blog.csdn.net/taiyang1987912/article/details/29271549 关于内存泄漏的总结 我的理解是deleteLater()会析构掉ThreadTcp=new QTcpSocket这个对象 如果我理解错了 请指正
tony2278 2017-09-01
  • 打赏
  • 举报
回复
delete ThreadTcp;我在析构函数中加delete ,信息就会发不出去 //Question: 在析构函数中 bu 加delete ,信息就会发出去?
飞翔的黄瓜 2017-09-01
  • 打赏
  • 举报
回复
引用 7 楼 u014430031 的回复:
connect(this,SIGNAL(finished()),this,SLOT(deleteLater())); 这句话已经是释放内存了 你还delete 一次干嘛。。
deleteLater()会析构掉ThreadTcp=new QTcpSocket我的这个对象么 另外你的意思是我在析构中加的delete 会在我还没发送完成的情况下就析构掉我的对象,可是我这个线程类的对象是用new创建的,如果我不delete掉这个线程类的对象,按理说就算它离开作用域也不会调用析构函数把,那我的析构函数中的delete是怎么调用的呢
橙儿稻香 2017-09-01
  • 打赏
  • 举报
回复
另外还看了一下deleteLater()支持这种线程循环事件的安全函数 ThreadTcp->waitForBytesWritten(-1); 这句话是有阻塞的 delet额不能保证会等到发送后才释放
橙儿稻香 2017-09-01
  • 打赏
  • 举报
回复
connect(this,SIGNAL(finished()),this,SLOT(deleteLater())); 这句话已经是释放内存了 你还delete 一次干嘛。。
飞翔的黄瓜 2017-08-31
  • 打赏
  • 举报
回复
引用 4 楼 qqwangfan 的回复:
你的MyThread 类的对象在外面用的不对吧,如果在外面用的是局部变量,信号还没发出去,就出了对象的作用域,调用MyThread 类的析构函数了,ThreadTcp都被delete掉了,肯定信息发送不出去。 解决方法:你在外面不要将MyThread的对象定义为局部变量才行。
多谢您再次解答我的问题 我这个MyThread的对象是用new创建在堆上的,离开了作用域我没有delete MyThread这个对象应该不会调用析构函数把
飞翔的黄瓜 2017-08-31
  • 打赏
  • 举报
回复
引用 3 楼 yuyu414 的回复:
connect(this,SIGNAL(finished()),this,SLOT(deleteLater())); 线程结束直接delete了,没来得及进入事件循环,线程中需要事件循环的话用movetoThread更好
我这个线程只调用一次,不用循环,如果我不在析构函数中加delete 就完全没有问题,加了信号就发不出去了 不明白为什么
yyxmm 2017-08-27
  • 打赏
  • 举报
回复
connect(this,SIGNAL(finished()),this,SLOT(deleteLater())); 线程结束直接delete了,没来得及进入事件循环,线程中需要事件循环的话用movetoThread更好
  • 打赏
  • 举报
回复
你的MyThread 类的对象在外面用的不对吧,如果在外面用的是局部变量,信号还没发出去,就出了对象的作用域,调用MyThread 类的析构函数了,ThreadTcp都被delete掉了,肯定信息发送不出去。 解决方法:你在外面不要将MyThread的对象定义为局部变量才行。
飞翔的黄瓜 2017-08-26
  • 打赏
  • 举报
回复
引用 1 楼 jxgyzhang 的回复:
run里没有exec吧
我没有加 但是如果我不在析构中加delete 就可以发出去的
_Will_ 2017-08-25
  • 打赏
  • 举报
回复
run里没有exec吧

16,175

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧