Visual studio 2008 将数组写入

Visual studio 2008 将数组写入,visual-studio-2008,visual-c++,mfc,Visual Studio 2008,Visual C++,Mfc,这是MFC项目的一部分。它崩溃了。 1.我正在尽可能快地将数组数组写入二进制文件。我用了不同的方法来避免崩溃,比如EnterCriticalSection等。它失败了。 这是一个大型项目的例子。我正在尝试实践这种方法的可行性 char filename[200]; UINT ThreadProc( LPVOID Param ); int *BUF[10]; int count = 0; void CThreadDlg::OnOK() { for (int i = 0; i <

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

使用BinaryReader.Readbyte[]、int、int或BinaryReader.ReadBytesint读取块可能是最简单的方法,然后使用Buffer.BlockCopy将字节有效地转换为浮点值等。不过,请注意,这将是endian敏感的。如果您想更可靠地转换,以便以后可以更改endianness,或者在big-endian平台上运行,您可能需要重复调用ReadFloat。

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

从OnOK开始,假设计数为3。为它分配缓冲区并启动线程。您假定这个新线程将接收count=3。但你大错特错了。当线程实际启动时,count的值可能是3..10,我是指第四个线程,对于count=3,忽略先前启动的线程。由于同一个计数可能由多个线程处理,因此可能会产生重复的文件名。 一旦启动所有线程,就立即删除分配的缓冲区!您是否知道线程可能已经或可能尚未开始/完成处理?如何删除整个缓冲区集,而不让线程处理它们?猛敲撞车! 这种线程同步/数据传递不使用全局变量BUF和count。只需在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;
   ...
}

您可能想阅读:,或者。

可能您误解了我的问题。我正在尝试使用线程将10个缓冲区写入10个不同的文件。数组的类型为Int。您能否扩展您的建议,并演示如何将缓冲区和计数或文件名传递给ThreadProc?。你只是在传递缓冲区。传递缓冲区和计数或文件名。好的,在这种情况下,只需传递文件计数器。在线程func中准备缓冲区,使用它并将其删除。否,必须同时传递这两个缓冲区。也许可以创建一个同时具有这两个属性的结构或类,并将其作为对象传递给线程?是的,您可以这样做。但您必须动态地分配一个对象,并在线程中释放它。如果我连续这样做相对较多的次数,这将减慢进程。有哪些安全选项可用?。