【问题标题】:write arrays to将数组写入
【发布时间】:2012-11-28 04:59:51
【问题描述】:

这是 MFC 项目的一部分。它崩溃了。 1. 我正在尝试尽可能快地将数组数组写入二进制文件。我使用了不同的方法来避免崩溃,例如 EnterCriticalSection 等。它失败了。 这是一个更大的项目的例子。我正在尝试实践这种方法的可行性。

char filename[200];
UINT ThreadProc( LPVOID Param );
int *BUF[10];
int count = 0;
void CThreadDlg::OnOK() 
{
     for (int i = 0; i < 10; ++i)
     {
            BUF[i] = new int [500];
            for (int j = 0; j < 500; ++j)
            {
                BUF[i][j] = i + j;
            }



            AfxBeginThread(ThreadProc,NULL,THREAD_PRIORITY_NORMAL,0,0,NULL);
            count  = count + 1;

     }



     for (int i = 0; i < 10; ++i)
     {
        delete [] BUF[i];
        BUF[i] = NULL;
     }

}


UINT ThreadProc( LPVOID Param )
{
    sprintf_s(filename, "C:\\Temp\\test%d.bin", count);
    std::ofstream file;
    file.open(filename, std::ios::out);
    file.write((char *)BUF[count], 4*500);
    file.close();
    file.clear();

    return TRUE;
}

【问题讨论】:

    标签: visual-studio-2008 visual-c++ mfc


    【解决方案1】:

    读取块可能是最简单的(使用BinaryReader.Read(byte[], int, int)BinaryReader.ReadBytes(int)),然后使用Buffer.BlockCopy 有效地将字节转换为浮点数等。但是请注意,这将是字节序敏感的。如果您想更稳健地转换(以便以后可以更改字节序,或在大字节序平台上运行),您可能需要反复调用ReadFloat()

    【讨论】:

    • 可能你误解了我的问题。我正在尝试使用线程将 10 个缓冲区写入 10 个不同的文件。数组是 Int 类型的。
    【解决方案2】:

    代码没有任何线程同步。您动态分配 10 个不同的缓冲区(500 个元素),并启动 10 个不同的线程。您在逻辑上Nth 缓冲区分配给Nth 线程。但是您不同步 count 变量。考虑一下:

    • OnOK,假设count 是3。你为它分配缓冲区并启动线程。您确实假设 count = 3 将被这个新线程接收。但你大错特错。当线程实际启动时,count 的值可能是 3..10(我的意思是第 4 个线程,对于 count=3,忽略之前启动的线程)。您可能会重复文件名,因为相同的count 可能会被多个线程处理。
    • 一旦启动所有线程,就会立即删除分配的缓冲区!您是否知道线程可能已经开始/完成处理?如何在不让线程处理它们的情况下删除整个缓冲区集?砰!崩溃!

    而不是使用全局变量BUFcount 进行这种线程同步/数据传递。只需分配缓冲区(在 for 循环内),并使用 thread-param 参数(LPVOID 参数)发送缓冲区。在线程中接收相同的缓冲区,对其进行类型转换,使用它,写入然后从线程本身中删除它。不要从OnOK 中删除缓冲区。

    示例代码:

    int* pBuffer = new int [500];
    // Assign different values to `pBuffer`, and then...
    AfxBeginThread(ThreadProc,pBuffer);
    

    在线程中:

    UINT ThreadProc( LPVOID Param )
    {
       int* pTheBuffer = (int*)Param;
       ...
    }
    

    您可能想阅读:this articlethis article

    【讨论】:

    • 您能否扩展您的建议并展示如何将缓冲区和计数或文件名传递给 ThreadProc?你只是通过缓冲区。传递缓冲区和计数或文件名。
    • 好的,在这种情况下,只需传递文件计数器。在线程函数中准备缓冲区,使用它并从那里删除它。
    • 不行,两个都要通过。也许创建一个结构或类,并将其作为对象传递给线程?。
    • 是的,你可以这样做。但是你必须动态分配一个对象,并在线程中释放它。
    • 如果我连续执行此操作的次数相对较多,这会减慢进程。有哪些安全选项可用?。
    猜你喜欢
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多