写数组到

时间:2012-11-28 04:59:51

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

这是MFC项目的一部分。它崩溃了。 我正试图尽可能快地将数组数组写入二进制文件。我使用不同的方法来避免崩溃,例如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;
}

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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;
   ...
}

您可能需要阅读:this articlethis article