C++ 更健壮的WriteFile

C++ 更健壮的WriteFile,c++,winapi,file-io,nas,C++,Winapi,File Io,Nas,我们的问题是: 我们正在捕获视频并将数据写入文件系统,通常是NAS设备。因此,我们有顺序数据要写入,而这段代码将写入同一NAS上的多个文件-在99%的时间内有效,但偶尔此函数会挂起 我有一个将数据写入文件的函数 STDMETHODIMP FileWriter::Receive(LONG lStreamId, IStreamPacket* pPacket) { CMutexAutoLock lock(&m_csAccessControl); HRESULT hr = S_

我们的问题是: 我们正在捕获视频并将数据写入文件系统,通常是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()函数始终完成?我已经读过关于使用重叠IO的内容,但我不确定我将如何进行,以及这是否合适。

重叠I/O是异步的,或者将I/O移动到非UI线程。许多NAS设备似乎特别有问题,并且对缓冲区大小非常敏感,因此请一次处理您试图写入的数据量。@JonathanPotter谢谢,我将尝试处理缓冲区大小。我感觉这已经在非UI线程上完成了。同时,实现重叠IO有多困难?只是不要这样做,这只会增加更多的bug。修复您的硬件、网卡、驱动程序和NAS都在您的印章列表中。反恶意软件和防火墙,如果您使用它们。这种硬件通常非常便宜,一定要把钱花在像样的东西上。@HansPassant谢谢,尽管我们已经在硬件上花了不少钱。我们从不购买消费级硬件,它总是工业设备。感谢大家对使用重叠IO的评论——这是我最后一次尝试——我们谈论的冻结时间有多长?