昨晚在作ModBus的时候遇到了两个问题,第一个是tcpsocket忽然没法发送数据了,显示tcpsocket没法跨进程调用;第二个是编译时一直显示没法访问QObject的私有变量。socket
当时的状况是这样的,通过两天的思考与实现以后,程序忽然没法收到从RTU返回的信息了,两天前一样的收集线程程序明明能够的。找了半天究竟是哪里出了问题。 tcp
最后发现问题是出在启动线程的start()
函数上,以前个人全部线程都是在主线程初始化的时候就start。主进程里面有线程的对象(不是指针),线程的对象会随着主进程初始化而初始化,tcpsocket对象(不是指针)在线程初始化的时候初始化,同时经过tcp/ip链接模拟程序。这样线程初始化完成以后就马上开始运行。 函数
后来我写了一个按钮响应,把线程的start()
给挪到按钮响应里去了,这样以后每次tcpsocket发送数据的时候就是出错,输出“tcpsocket没法跨线程调用”,因而我又把start给挪回构造函数里了,下一步准备试一下在按钮响应里面new一个线程的对象。 spa
这个问题我以为多是由于主进程和线程的关系的缘由?线程
这个问题实际上是发生在上一个问题以前的,这个问题在以前的我看来实际上是蛮无厘头的。光说可能没啥感受,上个图先。 指针
上图就是此次问题的三个主角,DataBlock
、CollectionThread
、DBManager
。 须要交代的是DataBlock这个主角中的主角是一个关系户,他爸爸是QObject(传说中Qt你们庭里面大部分人的爷爷or太爷爷...) 也就是说DataBlock直接继承自QObject。而后编译的时候就一直提示我“没法访问QObject的私有成员”,我还真信了,跑去看了几个DataBlock里面的变量,后来想不可能啊,以我这奇葩的命名方式,怎么可能会那么巧合的重名!因而我百度了。 code
而后我发现是由于QObject不容许copy或者opeartor=,而后我看了看个人代码,果然有地方用了等于号。对象
原本是想借用Qt的QObject的管理机制来管理这个DataBlock的,原来这么多限制, 因而就取消了DataBlock和QObject的父子关系, 因而就不让DataBlock继承QObject了,也不用Q_OBJECT宏了。这样就解决了。 blog
须要注意的是以前我觉得必须归入Qt的体系中才能够用QList管理数据,如今发现不须要归入Qt的体系也能够用QList管理数据。继承
(2015.10.20补充)
今天我又遇到Qobject的子类不能copy和operator=的问题了,可是我须要在那个类里面使用connect函数链接槽函数和消息,这该怎么办呢?
我想了一个麻烦的办法和一个简单的办法。麻烦的办法就是传给它一个是Qobject子类的对象的指针,用这个指针来调用connect函数。
简单的办法有效,因此我就没有尝试麻烦的办法究竟可行不可行,QObject::connect(...)
,这样就好了。 我理解的qt程序是都运行在一个core上,因此只须要通知它绑定了什么信号和槽就好了。