现在的场景是,不定时会有新文件来到指定文件夹,我设定是来一个新文件就触发信号,将文件的信息加入向量中,定时遍历这个向量,同时上传其中的文件,上传完毕后将文件remove出向量,但是我尝试之后,发现不可行,会报错
if(!ToUploadFileVec.isEmpty())
{
for(int i = 0; i < ToUploadFileVec.size(); i++)
{
//上传文件
FtpManager * ftp = new FtpManager("127.0.0.1", "anonymous", "", 21, this);
QString localFile = ToUploadFileVec.at(i).filePath;
ftp->S_uloadFile(localFile, "");
//传输成功
connect(ftp, &FtpManager::G_sndSucess, this, [=]()
{
qDebug() << __LINE__ << "remove";
ToUploadFileVec.removeAt(i);
});
}
}
请问这种同时上传多个文件到底应该如何实现
使用生产者消费者模型,把代码重构一下
生产者线程:来一个新文件就触发信号,将文件的信息加入向量队列中m_ToUploadFileVec(注意加锁),然后通知消费者线程处理事件
消费者线程池:启动一组线程,并行上传多个文件。从向量队列中m_ToUploadFileVec(注意加锁)获取文件信息,上传,上传成功从m_ToUploadFileVec中删除当前向量元素
这样remove会出错,删除后vector整个会往前移的。可以采用每次都用第一个,然后使用erase擦除保证 删除的位置不会出错。
if(ToUploadFileVec.size() > 0)
{
QString localFile = ToUploadFileVec.at(0).filePath;
//你的代码
//...
ToUploadFileVec.erase(ToUploadFileVec.begin());
}
给你找了一篇非常好的博客,你可以看看是否有帮助,链接:QT FTP上传文件