qt中socket指针跨线程问题

jkfbaidu 2010-04-20 10:14:10
#include "serverThread.h"
#include "mainpanel.h"
#include <QtNetwork>
#include <QTimer>

serverThread::serverThread(int socketDescriptor,QObject *parent)
:QThread(parent),socketDescriptor(socketDescriptor)
{
dsv = (airServer *)parent;

}

void serverThread::run()
{
tcpSocket=new QTcpSocket;
if (!tcpSocket->setSocketDescriptor(socketDescriptor))
{
emit error(tcpSocket->error());
return;
}
if(dsv->dlg->getMode() == 0)
{
preMode=0;
curMode=0;
}

else if(dsv->dlg->getMode() == 1)
{
preMode=1;
curMode=1;

}
sendMessage();
connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readSocket()));
timer=new QTimer;
timer->start(1000);
connect(timer,SIGNAL(timeout()),this,SLOT(judge()));
exec();
}

void serverThread::ntoc(int num)
{
msg1[2]=num/10+'0';
msg1[3]=num%10+'0';
}

void serverThread::readSocket()
{
char getmsg[20]={0};
tcpSocket->read(getmsg,20);
qDebug("&&&&%s",getmsg);
int n;
n=(getmsg[0]-'0')*10+(getmsg[1]-'0');
qDebug("%d",n);
if(getmsg[11]=='B')
{
dsv->dlg->ifwork[n]=1;
}
else
{
dsv->dlg->ifwork[n]=0;
}
if(dsv->dlg->judge()==0)
dsv->dlg->setStatusSB();
else
dsv->dlg->setStatusWork();
if(getmsg[11]=='D')
{
// tcpSocket->disconnectFromHost();
// tcpSocket->waitForDisconnected();
qDebug("duan");
quit();
}
}

void serverThread::sendMessage()
{
memset(msg1,0,20);

if(curMode == 0)
{
msg1[0]='L';
}

else if(curMode == 1)
{
msg1[0]='H';
}
msg1[1]=' ';
ntoc(dsv->dlg->getLastNum());
msg1[4]='0';
msg1[5]=' ';
qDebug("~%s",msg1);
tcpSocket->write(msg1);

}

void serverThread::judge()
{
if(dsv->dlg->getMode() == 0)
{
preMode=curMode;
curMode=0;
}

else if(dsv->dlg->getMode() == 1)
{
preMode=curMode;
curMode=1;
}
if(curMode!=preMode)
sendMessage();
if(dsv->dlg->ifclose==0)
{
tcpSocket->disconnectFromHost();
tcpSocket->waitForDisconnected();
}
}

我在槽函数judge();里调用sendMessage();说我socket指针跨线程了,我的socket是在run里new的啊,为什么跨线程了,求指点
...全文
541 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Aji78 2012-03-29
  • 打赏
  • 举报
回复
如果有多个socket客户端联过来的时候,采用direct方式是不能区分socket客户端的。
staronic 2011-10-31
  • 打赏
  • 举报
回复
如何不合理?[Quote=引用 9 楼 wulin2909 的回复:]

这样解决是不合理的
[/Quote]
wulin2909 2011-10-12
  • 打赏
  • 举报
回复
这样解决是不合理的
jkfbaidu 2010-04-22
  • 打赏
  • 举报
回复
谢谢楼上各位,问题我自己已经解决了,timer调用judeg();时,后面加上Qt::DirectConnection
即:connect(timer,SIGNAL(timeout()),this,SLOT(judge()),Qt::DirectConnection);
bsr2009 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 tingsking18 的回复:]

子线程不能操作UI
引用 2 楼 bsr2009 的回复:

看看有没有可能在子线程中修改了UI之类的东西。
[/Quote]
我是叫LZ检查他的程序有没有在子线程中修改了UI之类的东西。
bsr2009 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 tingsking18 的回复:]

子线程不能操作UI
引用 2 楼 bsr2009 的回复:

看看有没有可能在子线程中修改了UI之类的东西。
[/Quote]
还有在子线程中读写文件的正确使用也有关系,程序都会不正常。 我刚开始学S60的时候,就吃过这两个的亏。
tingsking18 2010-04-21
  • 打赏
  • 举报
回复
子线程不能操作UI
[Quote=引用 2 楼 bsr2009 的回复:]

看看有没有可能在子线程中修改了UI之类的东西。
[/Quote]
bsr2009 2010-04-21
  • 打赏
  • 举报
回复
看看有没有可能在子线程中修改了UI之类的东西。
tingsking18 2010-04-21
  • 打赏
  • 举报
回复
你线程是怎么启动的?
Sephoenix 2010-04-21
  • 打赏
  • 举报
回复
友情up一下
标准c库大全:C++标准库介绍 疯狂代码 http://CrazyCoder.cn/ ĵ:http:/CrazyCoder.cn/VC/Article12860.html   标准库提供了C基本设施虽然C标准库随着C标准折腾了许多年直到标准出台才正式定型但是在标准库实 现上却很令人欣慰得看到多种实现并且已被实战证明为有工业级别强度佳作 1、Dinkumware C Library 参考站点:http://www.dinkumware.com/ P.J. Plauger编写高品质标准库P.J. Plauger博士是Dr. Dobb\'s设计杰出奖获得者其编写库长期被Microsoft采 用并且最近Borland也取得了其OEMlicense在其C/C产品采用Dinkumware库 2、RogueWave Standard C Library 参考站点:http://www.roguewave.com/ 这个库在Borland C Builder早期版本曾经被采用后来被其他库给替换了笔者不推荐使用 3、SGI STL 参考站点:http://www.roguewave.com/ SGI公司C标准模版库 4、STLport 参考站点:http://www.stlport.org/ SGI STL库平台可移植版本 C各大有名库介绍——准标准库Boost   Boost库是个经过千锤百炼、可移植、提供源代码C库作为标准库后备是C标准化进程发动机的 Boost库由 C标准委员会库工作组成员发起在C社区影响甚大其成员已近2000人 Boost库为我们带来了最新、最酷、最 实用技术是不折不扣“准”标准库 Boost比较有名气有这么几个库: Regex 正则表达式库 Spirit LL parser framework用C代码直接表达EBNF Graph 图组件和算法 Lambda 在地方定义短小匿名对象很实用functional功能 concept check 检查泛型编程concept Mpl 用模板实现元编程框架 Thread 可移植C多线程库 Python 把C类和映射到Python的 Pool 内存池管理 smart_ptr 5个智能指针学习智能指针必读份不错参考是来自CUJ文章: Smart Poers in Boost,哦这篇文章可以查到CUJ是提供在线浏览文版见笔者在Dr.Dobb\'s Journal软件 Software研发杂志第7辑上译文   Boost总体来说是实用价值很高质量很高库并且由于其对平台强调对标准C强调是编写平台无关现代C开 发者必备工具但是Boost也有很多是实验性质东西在实际开发实用需要谨慎并且很多Boost库功能堪称对 语言功能扩展其构造用尽精巧手法不要贸然花费时间研读Boost另外面比如Graph这样库则是具有工业强度结构 良好非常值得研读精品代码并且也可以放心在产品代码多多利用 参考站点:http://www.boost.org C各大有名库介绍——GUI   在众多C库GUI部分库算是比较繁荣也比较引人注目在实际开发GUI库选择也是非常重要件事情下面我 们综述下可选择GUI库各自特点以及相关工具支持 1、MFC   大名鼎鼎微软基础类库(Microsoft Foundation Class)大凡学过VC人都应该知道这个库虽然从技术角度讲 MFC是不大漂亮但是它构建于Windows API 的上能够使员工作更容易,编程效率高减少了大量在建立 Windows 时必须编写代码同时它还提供了所有般 C 编程优点例如继承和封装MFC 编写在各个版本 Windows操作系统上是可移植例如在Windows 3.1下编写代码可以很容易地移植到 Windows NT 或 Windows 95 上但是在最近发展以及官方支持上日渐势微[Page] 2、QT 参考网站WebSite:http://www.trolltech.com   Qt是Trolltech公司个多平台C图形用户界面应用框架它提供给应用开发者建立艺术级图形用户界面所需所 用功能Qt是完全面向对象很容易扩展并且允许真正地组件编程自从1996年早些时候Qt进入商业领域它已经成 为全世界范围内数千种成功应用基础Qt也是流行Linux桌面环境KDE 基础同时它还支持Windows、Macosh、 Unix/X11等多种平台 3、WxWindows 参考网站WebSite:http://www.wxwindows.org   平台GUI库其类层次极像MFC所以有文章介绍从MFC到WxWindows代码移植以实现平台功能通过多 年开发也是个日趋完善GUI库支持同样不弱于前面两个库并且是完全开放源代码新近C Builder XGUI设计器就 是基于这个库 4、Fox 参考网站WebSite:http://www.fox-toolkit.org/   开放源代码GUI库作者从自己亲身开发经验得出了个理想GUI库应该是什么样子感受出发从而开始了对 这个库开发有兴趣可以尝试下 5、WTL   基于ATL个库使用了大量ATL轻量级手法模板等技术在代码尺寸以及速度优化方面做得非常到位主要面向 使用群体是开发COM轻量级供网络下载可视化Control控件开发者 6、GTK 参考网站WebSite:http://gtkmm.sourceforge.net/   GTK是个大名鼎鼎C开源GUI库在Linux世界有Gnome这样杀手应用而Qt就是这个库C封装版本 C各大有名库介绍——网络通信 1、ACE 参考网站WebSite:http://www.cs.wustl.edu/~schmidt/ACE.html   C库代表超重量级网络通信开发框架ACE自适配通信环境(Adaptive Communication Environment)是可 以自由使用、开放源代码面向对象框架在其实现了许多用于并发通信软件Software核心模式ACE提供了组丰 富可复用C包装外观(Wrapper Facade)和框架组件可越多种平台完成通用通信软件Software任务其包括:事 件多路分离和事件处理器分派、信号处理、服务化、进程间通信、共享内存管理、消息路由、分布式服务动态 (重)配置、并发执行和同步等等 2、StreamModule 参考网站WebSite:http://www.omnarious.org/StrMod   设计用于简化编写分布式库尝试着使得编写处理异步行为更容易而不是用同步外壳包起异步本质 3、SimpleSocket 参考网站WebSite:http://home.hetnet.nl/~lcbokkers/simsock.htm   这个类库让编写基于客户/服务器更加容易 4、A Stream Socket API for C 参考网站WebSite:http://www.pcs.cnu.edu/~dgame/s/sC/s.html   又个对Socket封装库 C各大有名库介绍——XML 1、Xerces 参考网站WebSite:http://xml.apache.org/xerces-c/   Xerces-C 是个非常健壮XML解析器它提供了验证以及SAX和DOM APIXML验证在文档类型定义 (Document Type DefinitionDTD)方面有很好支持并且在2001年12月增加了支持W3C XMLSchema 基本完整 开放标准 2、XMLBooster[Page] 参考网站WebSite:http://www.xmlbooster.com/   这个库通过产生特制parser办法极大提高了XML解析速度并且能够产生相应GUI来修改这个parser在 DOM和SAX两大主流XML解析办法的外提供了另外个可行解决方案 3、Pull Parser 参考网站WebSite:http://www.extreme.indiana.edu/xgws/xsoap/xpp   这个库采用pull思路方法parser在每个SAXparser底层都有个pullparser这个xpp把这层暴露出来直接给大 家使用在要充分考虑速度时候值得尝试 4、Xalan 参考网站WebSite:http://xml.apache.org/xalan-c/   Xalan是个用于把XML文档转换为HTML纯文本或者其他XML类型文档XSLT处理器 5、CMarkup 参考网站WebSite:http://www.firstobject.com/xml.htm   这是种使用EDOMXML解析器在很多思路上面非常灵活实用值得大家在DOM和SAX的外寻求点灵感 6、libxml http://libxmlplusplus.sourceforge.net/   libxml是对著名libxml XML解析器C封装版本 C各大有名库介绍——科学计算 1、Blitz 参考网站WebSite:http://www.oonumerics.org/blitz   Blitz 是个高效率数值计算库它设计目是希望建立套既具像C 样方便同时又比Fortran速度更快数值计算环 境通常用C所写出数值比 Fortran慢20%左右因此Blitz正是要改掉这个缺点思路方法是利用Ctemplate技术执行 甚至可以比Fortran更快   Blitz目前仍在发展对于常见SVDFFTsQMRES等常见线性代数思路方法并不提供不过使用者可以很容易 地利用Blitz所提供来构建 2、POOMA 参考网站WebSite:http://www.codesourcery.com/pooma/pooma   POOMA是个免费高性能C库用于处理并行式科学计算POOMA面向对象设计方便了快速开发对并行机器 进行了优化以达到最高效率方便在工业和研究环境使用 3、MTL 参考网站WebSite:http://www.osl.iu.edu/research/mtl   Matrix Template Library(MTL)是个高性能泛型组件库提供了各种格式矩阵大量线性代数方面功能在某些 应用使用高性能编译器情况下比如Intel编译器从产生汇编代码可以看出其和手写几乎没有两样效能 4、CGAL 参考网站WebSite:www.cgal.org   Computational Geometry Algorithms Library目是把在计算几何方面大部分重要解决方案和思路方法以 C库形式提供给工业和学术界用户 2009-2-12 3:54:40 疯狂代码 http://CrazyCoder.cn/
鸣谢 首先要感谢linus,给了我们一个可以自由翱翔的平台; 其次,要感谢网络上千万的linux/windows先行者,给予的有意或无意的指点和帮助; 再次,感谢陈皓兄的《跟我一起写makefile》,引导我走过了makefile的迷雾。后来发现于凤昌兄译的《GNU Make使用手册》,也有颇多受益。 背景 从2004年,我在一个公司作服务端软件的开发,要支持linux/windows平台,主要是为了容易维护,就设计、开发了这一套比较常用的类。 2005一直在windows下作IPTV的开发,在2006年底,又回到linux下作IPV6下IPTV的开发。在空闲时间,看看两年前的那些零散类文件,开始整理这些类成库,并写了简单的使用和测试范例,放在网上和朋友们共享。 由于早期的平台从windows98和VC6.0,redhat8.0,经历了些变迁,没有太多的时间再一一仔细测试,就用现在的windowsXP和VS.2003,Fedaro Core4.0作的测试。 主要是为了相互学习,希望能和朋友们共同进步!如有引用,请标明出处,会不胜感激!禁止商业性的书籍的引用!很多不良的作者,完全是在骗钱。 功能简介 通用于linux/windows平台C++的应用。 主要是对一些系统功能,进行了简洁封装。 主要有读写锁类, 线程类, 线程池类, 定时器类, socket1.1的封装类, ini文件类, txt文件类, 可删除内容的文件类, 查找文件类, 调试输出类, 字符串类, 同步的普通队列和优先级队列类, 智能指针和内存自动管理类,数据库类. 特别声明:因为环境限制,这次测试代码,没有测试数据库类。我以前也只是在PostgreSQL,SQL Server2000和Acess2000实际用过。如有朋友用到,请自行修改、测试。 这些类的风格,与个人习惯密切相关。推荐QT平台的类库,还是不错的;ACE就太难使用了! 编译和运行: 1. windwos下,用vs2003打开pub下的test.sln文件,所有的测试程序和类库文件就载入,编译即可。其它程序引用库时,请选/MDd选项。 2. linux下,执行pub下的Makefile文件,编译即可。如果没有安装PostgreSql,数据库部分会编译不过。 关于inline函数 我写的这些类的函数,大部分是可以写成inline函数的,对性能提高也有很大的帮助。但是,GCC和VC的不同版本编译器的支持程度不同,可能会编译不过,所以就都没有为提高效率而写inline函数。依赖于编译器,对平台的程序来说,也比较麻烦! 不过,现在的硬件系统,对这些小小的性能提升,也感觉不出来的。 如有需要,请自行改写! 关于异常和错误处理 也是仁者见仁,智者见智! 习惯于C开发的朋友,大概喜欢函数错误时返回错误码。函数有返回值,就要处理,就使程序逻辑较为复杂,看去也比较的混乱。 我则喜欢用异常代替,主要是代码简洁和逻辑清晰。异常抛掷,会使流程很简洁,只显示执行正确时的流程,错误集处理 对于那些失败即意味着止的一个操作,我让其抛掷异常。如果是正常的分支流程,则用返回失败值。就我遇到的情况,大部分则为操作失败,调用的流程一般都要止的。 这个判断也是比较难下的。放在一个局部,异常可能导致操作止;但放在更上一层,则异常又可能是正确程序流程处理。 bug的反馈和修改支持 如果有重大的错误需要偶修正,请发到linhweikuo@hotmail.com的邮箱,尽量说明问题的现象,我会在一周内解决的(如果工作比较紧急的时候,不能即时就处理的)。

16,215

社区成员

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

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