我们的问题: 我们正在捕获视频并将数据写入FileSystem,通常是NAS设备。所以我们要编写顺序数据,这段代码将写入同一个NAS上的多个文件 - 99%的时间它可以工作,但偶尔会挂起这个函数。
我有这个函数将数据写入文件。
STDMETHODIMP FileWriter::Receive(LONG lStreamId, IStreamPacket* pPacket)
{
CMutexAutoLock lock(&m_csAccessControl);
HRESULT hr = S_OK;
// AddRef the packet to prevent loss
pPacket->AddRef();
if (m_hFile != INVALID_HANDLE_VALUE && pPacket) {
DWORD written = 0;
BYTE* pData = NULL;
LONG lLen = 0;
pPacket->get_Pointer(&pData);
pPacket->get_ActualDataLength(&lLen);
if (pData && lLen) {
WriteFile(m_hFile, pData, lLen, &written, NULL);
m_llPosition += written;
if (m_llPosition > m_llLength) {
m_llLength = m_llPosition;
}
}
m_xiPosition = (LONG)m_llPosition;
m_xiLength = (LONG)m_llLength;
m_xiLengthInMB = (LONG)(m_llLength/1024/1024);
}
// Release packet
pPacket->Release();
return hr;
}
现在,我无法轻松测试此代码,因为它在内部用于我正在使用的框架。但是我确实有这个代码。
我在网上看到WriteFile()函数可以冻结应用程序,当目标文件系统是NAS时,我们就会发生这种情况,但只是偶尔发生。写入本地硬盘时,这绝不是问题。不幸的是,我们需要一个非常强大的解决方案,我们可以毫无问题地写入NAS。
如何修改此代码以便WriteFile()函数始终完成?我已经阅读了有关使用Overlapped IO的内容,但我不确定如何进行此操作以及是否合适。