怎么将主线程post到工作线程中的一块数据保存在工作线程的队列中啊?
我要实现的功能是这样的,在主线程的一个循环中调用ReadFile()函数读取一个800M的大文件,每次读取1M的数据量,然后对这些数据进行其它的处理。同时还须将读到的数据发送到工作线程中去,在工作线程中将这些数据写入文件中。
我在主线程中new了一块buffer,大小为1M.每次读取1024*1024(也就是1M )大小的数据,保存在buffer中。然后再将这块数据通过消息发送到工作线程中去,我在工作线程中再将接收到的这块数据写入到另一个文件中。发送消息用的是
PostThreadMessage()函数。
#define SEND_BUF_LEN 1024*1024
char* pBuf = new char[ SEND_BUF_LEN ];
ReadFile(stream, pBuf, SEND_BUF_LEN, &numread, NULL);
...
...
::PostThreadMessage(m_writeThread->m_nThreadID,WM_WRITERECORD,WPARAM(SEND_BUF_LEN),LPARAM(pBuf) );
...
我原来在工作线程里也new了一个1M大小的buffer,然后将主线程发送过来的数据都用memcpy()函数拷贝到了工作线程的buffer里。再将这个新的buffer中的数据写入到文件中。可是我后来发现,这种处理方式有时会导致丢失数据。之所以会丢失数据,我怀疑是因为线程函数中前一个buffer里的数据还没全部写入到文件里呢,而下一个消息又已经到了,导致前一个的数据没能全部写完。为了不阻塞主线程,所以我不能用SendMessage()发消息。我现在想在工作线程中建立一个队列,在队列里保存主线程发送过来的数据,再由工作线程不停地去队列里取数据,这样子,就可以保证数据不会丢失了。只是不知道该怎么在线程里使用队列,以前用的都是CArray或是CList等现成的数据结构。请高手不吝赐教。