项目背景,读取配置文件,控制多个led设备显示。
遍历读取一个设备的配置信息后去控制对应设备,ftp上传文件
tmp = nam.put(QNetworkRequest(url), data);//tmp是成员变量
if(tmp != NULL)
{
replyMap[info.ip] = tmp;
connect(tmp, SIGNAL(finished()), this, SLOT(sendUpdateCmd()));
connect(tmp, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(OnError(QNetworkReply::NetworkError)));
}
在sendUpdateCmd方法里再调用
tmp->deleteLater();
tmp = NULL;
以为会立马调用put方法,且去触发finished信号,从而顺序执行每个led设备,后来发现并不是
这里是异步的,即上述代码被快速的执行多次
从而导致多个led设备,总是最后一个设备无法执行。(搞不懂为什么)
代码改成
QNetworkReply *tmp = nam.put(QNetworkRequest(url), data);
if(tmp != NULL)
{
replyMap[info.ip] = tmp;
connect(tmp, SIGNAL(finished()), this, SLOT(sendUpdateCmd()));
connect(tmp, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(OnError(QNetworkReply::NetworkError)));
}
在sendUpdateCmd方法里
if(replyMap.contains(ip))
{
QNetworkReply *tmp = replyMap.take(ip);
tmp->deleteLater();
}
就可以保证每一次操作都是独立且成功。