在执行此操作之前,我想检查这是否会导致未定义的行为或竞争条件。使用信号和插槽增量上传文件
当上传文件到asure时,这必须以块为单位完成。我想要并行上传5个块,并且他们都从同一个文件中获取数据。这将会发生这样的情况:
char *currentDataChunk;
int currentDataChunkSize;
connect(_blobStorageProvider, SIGNAL(putBlockSucceded(int)), this, SLOT(finalizeAndUploadNextBlock(int)));
int parallelUploads = ((_item->size()/MAX_BLOCK_SIZE) >= MAX_PARALLEL_BLOCKUPLOADS) ? MAX_PARALLEL_BLOCKUPLOADS : (_item->size()/MAX_BLOCK_SIZE);
_latestProcessedBlockId = (parallelUploads - 1);
for(int i = 0; i < parallelUploads; i++) {
currentDataChunkSize = _item->read(currentDataChunk, MAX_BLOCK_SIZE);
...
uploader->putBlock(_container, _blobName, currentDataChunk, i);
}
在上传器中的putBlock函数中,它调用了QNetworkAccessManager。完成后,如果失败,成功或取消,则会发回一个信号,以及blockId,以便我知道已上传哪个块。
void BigBlobUploader::finalizeAndUploadNextBlock(int blockId) {
// FINALIZE BY ADDING SUCCESSFUL BLOCK TO FUTURE BLOCKLIST
QByteArray temp;
for(int i = 0; i != sizeof(blockId); i++) {
temp.append((char)(blockId >> (i * 8)));
}
_uploadedBlockIds.insert(blockId, QString(temp.toBase64()));
this->uploadNextBlock();
}
void BigBlobUploader::uploadNextBlock() {
char *newDataChunk;
int newDataChunkSize = _item->read(newDataChunk, MAX_BLOCK_SIZE);
...
_latestProcessedBlockId++;
uploader->putBlock(_container, _blobName, newDataChunk, _latestProcessedBlockId);
}
我现在的计划是获取这些信号的插槽应该注意到,该块被上传(把它放在一个列表,以便能够把块列表来完成此Blob),增加索引通过一个(从5开始)并获取新的数据块并重做整个过程。
现在我的问题是,如果他们中的两个在同一时间完成了怎么办?我没有在这里处理线程,但由于HTTP请求默认是线程化的,这里是什么情况?信号是排队的(还是应该使用QueuedConnection)?一个插槽可以并行调用吗?有没有更好的方法来做到这一点?
事情是,我不会有不同的线程访问此插槽,我需要知道这将如何与信号/槽机制在qt/c + +,而不是c# – chikuba 2012-04-19 09:03:24