Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用信号和插槽增量上传文件_C++_Qt_Azure Storage_Signals Slots_Qnetworkaccessmanager - Fatal编程技术网

C++ 使用信号和插槽增量上传文件

C++ 使用信号和插槽增量上传文件,c++,qt,azure-storage,signals-slots,qnetworkaccessmanager,C++,Qt,Azure Storage,Signals Slots,Qnetworkaccessmanager,在实施之前,我想检查一下这是否会导致未定义的行为或竞争条件 将文件上载到asure时,必须分块执行。我想并行上传5个块,它们都从同一个文件中获取数据。这将像这样发生: char *currentDataChunk; int currentDataChunkSize; connect(_blobStorageProvider, SIGNAL(putBlockSucceded(int)), this, SLOT(finalizeAndUploadNextBlock(int))); int par

在实施之前,我想检查一下这是否会导致未定义的行为或竞争条件

将文件上载到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);
}
我现在的计划是将这些信号提取到一个插槽中,该插槽应注意该块已上载(将其放入一个列表中,以便能够放入一个块列表以完成该blob),将索引增加1(从5开始),提取一个新的数据块并重新执行整个过程


我现在的问题是,如果其中两个在同一时间完成呢?这里我不是在处理线程,但是由于HTTP请求在默认情况下是线程化的,这里是什么情况?信号是否已排队(或是否应使用QueuedConnection)?插槽可以并行调用吗?有更好的方法吗

我不熟悉QNetworkAccessManager。但一般来说,为了处理竞争条件,请使用锁。通常,在C#中使用锁的方法是利用lock关键字。比如:

private object lockingObject = new object();

In a method:

lock
{
                // If a thread acquires a lock, another thread is blocked here until the lock is released.
}
此外,有关更多信息,您可以参考

致以最良好的祝愿


徐明。

很抱歉给您带来不便,我以为您正在使用.NET,因为您已将Windows Azure标记添加到此线程。我熟悉Windows Azure,但对Qt的了解有限。但是,它与在其他并发场景中使用信号/插槽没有什么不同。此文档可能有帮助:

致以最良好的祝愿


徐明。

问题是,我不会有不同的线程访问这个插槽,我需要知道这将如何与qt/c++而不是c中的信号/插槽机制一起工作#
private object lockingObject = new object();

In a method:

lock
{
                // If a thread acquires a lock, another thread is blocked here until the lock is released.
}