将数组写入



这是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.Read(byte[], int, int)BinaryReader.ReadBytes(int)),然后使用Buffer.BlockCopy有效地从字节转换为浮点值等可能是最简单的。请注意,这将是对endian敏感的。如果您想更健壮地转换(以便以后可以更改endianness,或者在big-endian平台上运行),您可能需要重复调用ReadFloat()

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

你可能想阅读:这篇文章,或者这篇文章。

相关内容

  • 没有找到相关文章

最新更新