标题:程序运行一段时间后就出问题。
作者:介农酥
日期:2019-08-03 14:19
内容:
程序运行一段时间就出问题。目前已经知道是因为QMutex的问题,将这mutex.lock和mutex.unlock去掉就没问题(测试了5遍就是这个问题)。
先介绍下程序,程序基本过程如下:
1)socket线程从服务器获取数据;
2)socket将数据发给data线程解析数据,分别是快递单号expressId,小车号carrierId;
3)data将快递单号发给http线程,http根据快递单号获取到格口boxid;
4)http将boxid发回给data,data将数据expressid,carrierId和boxid发给数据库、plc和界面。
因为expressId、carrierid和boxid不是同时获取,为了防止在获得boxid的同时,expressId和carrierid被socket下一波数据覆盖掉,导致数据不一致,我在访问expressId和carrierid之前先加了锁mutex.lock,在获取boxid并且将数据发给plc和界面及数据库之后解锁mutex.unlock。其中mutex是data的成员变量,加锁和解锁在两个不同的槽函数里。
程序总共五个线程,一个主线程GUI,一个socket线程,一个data和数据库线程,一个http线程,一个plc线程。
代码片段
一、socket获取数据
void Socket::readServer()
{
qDebug() readAll();
handleIndex = map.value(currentSocket);
emit dataFromSocketSignal(message, handleIndex, startTime); 将数据发给data线程
qDebug()
#1 [liulin188 08-03 15:26]
估计是多释放了,释放了已经释放的锁会奔溃。
#2 [介农酥 08-03 15:37]
有办法避免?
#3 回 liulin188 的帖子 [介农酥 08-03 15:37]
liulin188:估计是多释放了,释放了已经释放的锁会奔溃。 (2019-08-03 15:26)
有办法避免?
#4 [liulin188 08-03 16:05]
仔细检查下代码,我以前也遇到过这种问题。
#5 [liudianwu 08-03 21:49]
加了锁不解锁,作死!