Моя программа отслеживает изменения в указанных каталогах и выдает абсолютный путь для каждого вновь обнаруженного файла в очередь. Когда мой интерфейс Google Drive готов к следующему файлу, он отправляет сигнал в очередь, который затем возвращает путь к файлу для загрузки в интерфейс. Моя проблема в том, что если несколько файлов будут обнаружены до того, как первый из них завершит загрузку, моя программа попытается загрузить следующий файл в очередь, но QNetWorkReply никогда не выдаст сообщение Finished (). Если я подожду, пока загрузится первый файл, переместу файл, чтобы он был обнаружен, тогда второй файл будет загружен правильно.
Я полагаю, что это как-то связано с изменением области действия в googleDriveInterface :: uploadFile, прежде чем он сможет завершить загрузку, но я не уверен, как это исправить.
//connections made in main.cpp
//GOOGLE DRIVE INTERFACE MEMBER FUNCTIONS
void
googleDriveInterface::slotUploadFileToDrive(const QString &filePath){
QFileInfo file(filePath);
if (file.isDir() || file.size() > 52428800) {
qDebug() << "unable to upload: " << filePath << "either >50mb or a directory";
emit readyForNextUpload(); //get next file to upload
}
else {
uploadFile(filePath);
}
}
void
googleDriveInterface::uploadFile(const QString &filePath){
//code to initialize request
networkReply = networkManager->post(request, multiPart);
QObject::connect(networkReply, SIGNAL(finished()), this, SLOT(slotUploadResult()), Qt::DirectConnection);
}
void
googleDriveInterface::slotUploadResult() {
int statusCode = networkReply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); //we need to convert to int so we can use it with switch/case
switch (statusCode) {
case 200: //nothing to do, file succesfully uploaded
qDebug() << "file succuessfully uploaded to Google Drive";
emit readyForNextUpload(); //let program now we are ready for next file
break;
//rest of error handling
}
//QUEUE MEMBER FUNCTIONS
void
googleFileUploadQueue::slotShouldSendNextFile() {
fileQueue.dequeue(); //file at front of queue has been taken care of
if (!fileQueue.isEmpty()) {
emit nextFileToUpload(fileQueue.head());
}
}
void
googleFileUploadQueue::slotAddFileToQueue(const QString &filePath) {
fileQueue.enqueue(filePath);
if (fileQueue.size() == 1) { //queue was previously empty and we can send file for upload right away
emit nextFileToUpload(filePath);
}
}