1

这是 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;
}
4

2 回答 2

0

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

于 2012-11-28T05:04:02.510 回答
0

该代码没有任何线程同步。您动态分配 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;
   ...
}

您可能想阅读:这篇文章,或这篇文章

于 2012-11-28T07:49:18.710 回答