程序每次运行一段时间,就异常退出,没有任何提示,要么直接退出,要么弹出异常消息框。 程序主要功能:1)从4个服务器上分别获取数据A和B(每个服务器(TcpServer)1秒发送一次数据,4个服务器独立发送,可以同时发,没有时间顺序);2)根据数据A以HTTP的方式获取数据C;3)最后将数据A、B和C发送给PLC,插入数据库,回传数据给Http。不断从服务器上获取,不断重复后面的步骤。 今天突然想到到调试模式下运行下,发现报错了,代码跳到这个位置,我觉得这是一个很大的提示,截图如下:错误的地方在GetAdaptersAddresses()。 这是又一次调试模式运行下报的错:Invalid parameter passed to C runtime function(C++)百度知道上有解释:是引用了空或者野指针,之所以会有空指针或者野指针,是因为你在另外一个线程把这个指针置空或者释放了,遇到这种情况你需要对这个指针做加锁保护,不然没法解决问题。 这是又一次调试模式运行下报的错:不截图了,看红色的地方void QMYSQLResult::cleanup(){ Q_D(QMYSQLResult); if (d->result) mysql_free_result(d->result); // must iterate trough leftover result sets from multi-selects or stored procedures// if this isn't done subsequent queries will fail with "Commands out of sync"#if MYSQL_VERSION_ID >= 40100 while (driver() && d->drv_d_func()->mysql && mysql_next_result(d->drv_d_func()->mysql) == 0) { MYSQL_RES *res = mysql_store_result(d->drv_d_func()->mysql); if (res) mysql_free_result(res); //调试器箭头指向的位置。 }#endif更多的时候调试没有跳到什么地方,感觉每次调试,问题未必一样。不过程序还是照样运行呢,只是弹出报警框,点击确认,程序退出估计是多线程环境下,内存出了什么问题,但是线程还是要用的,不然性能上跟不上,计算机初级学者,还是希望大家多多帮忙!。真不知道程序哪里写的有bug。 写这个程序也是一波三折,我在论坛上也问过其他相关问题。最开始的时候,我将三个步骤分别放在不同的线程里,并且加了锁,但是运行一段时间解不了锁,之后我将三个步骤全放一个线程里,没有加锁,但是当同时接受4个服务器上的数据时,发现中间有很多次,执行了第一步,第二步,第三步没有执行,或者第二步,返回的字符串“”,如果接受1-3个服务器,我发现是来的及,不会出现什么问题,最后为了解决这个问题,我建立4个线程,每个线程分别独立执行业务流程,即从服务器1上获取数据,然后执行2)3)步,从服务器2获取数据,执行2)3)步,四个服务器,四个线程,独立完成任务,互不干扰,解决了问题,以为没事了,结果出来这个问题,关键这个问题,我都不知道错在哪,咋调试,如果我只打开一服务器,是没有问题的。前面分几个线程或者放在一个线程里的时候到时没出现过这个问题哦。 好不容易解决了业务和性能上的问题,又出现了这个问题,为什么要如此对我。我现在就是瞎猫看能不能碰上死耗子。
如果还需要提供什么,我可以附件提供,比如源代码。 201908201235 添加
是4个线程,4个线程独立完成任务,每个服务器(摄像机)对应一个线程,C数据是需要根据服务器上的数据(就是摄像头扫的快递号和小车号),从厂家给的接口获取的,这个接口申通的是数据库,比较简单,中通的是http方式,比较麻烦,很慢四五十毫秒,而且是异步的。即这样
服务器A-Http-PLC
服务器B-Http-PLC
服务器C-Http-PLC
服务器D-Http-PLC
Socket4个实例(参数:不同的IP),Http有四个实例,PLC也有4个实例
因为4个socket是独立发数据的,这样可能同时发数据,那么Http就处理不过来了,后面的socket会覆盖前面的。
但是单个socket,一次发数据的间隔有几百毫秒,这样如果一个Http实例只接受一个Socket数据,就能来的及了,而且这样确实也解决了问题。
4个独立线程里面的对象应该都在不同的内存区,但是有些事静态的变量,比如一些配置,因为这些配置对所有的对象来说是一样的,所以我定义成了static。
哦,对了,这些数据都要发给主
界面,通过信号和槽的方式,主线程只有一个实例,这算不算共享的存储区。
麻烦,在看看,再提供一些思路