这是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
可能由多个线程处理 - 一旦启动所有线程,就立即删除分配的缓冲区!你知道线程可能已经开始/完成处理了吗?如何删除整个缓冲区,而不让线程处理它们?猛敲撞车
不使用全局变量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;
...
}
你可能想阅读:这篇文章,或者这篇文章。