Наша проблема:
Мы записываем видео и записываем данные в файловую систему, обычно это устройство 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, но я не уверен, как бы я поступил об этом, и если это подходит.
Задача ещё не решена.