怎么将主线程post到工作线程中的一块数据保存在工作线程的队列中啊?

qingfeng_happy5 2008-10-27 06:43:10
我要实现的功能是这样的,在主线程的一个循环中调用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等现成的数据结构。请高手不吝赐教。
...全文
139 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qingfeng_happy5 2008-10-28
  • 打赏
  • 举报
回复
请问队列是怎么实现的?谁能给点提示的代码?
qingfeng_happy5 2008-10-28
  • 打赏
  • 举报
回复
为什么读取 处理 写入不在同一个模块当中呢?
//

是这样的,我的主线程无论如何都不能阻塞的,因为我读取完数据后,还要对这些数据进行更重要的处理,至于将这些数据写入文件,这只是次要需求,所以才令开了一个线程,并将那个工作线程的优先级设置得比较低。至于大家说的用事件进行同步,也不可取,因为无论如何,工作线程的处理都不可以影响主线程的工作,用事件的话就阻塞了。
dch4890164 2008-10-27
  • 打赏
  • 举报
回复
楼上说的方法可行
但是楼主的方法似乎还不够简单
为什么读取 处理 写入不在同一个模块当中呢
这不正是一个模块的特点 输入 处理 输出嘛
不知道你的具体问题是什么,如果可以的话问题或许会简单一点
野男孩 2008-10-27
  • 打赏
  • 举报
回复
定义一个list<char*> data_list;读出收据后data_list.push_back(buf),那边线程扫描队列,一有数据就把节点拿出来。挺方便的,data_list的访问做个同步就行了。
greatws 2008-10-27
  • 打赏
  • 举报
回复
你这样的需求,无论如何主线程都是要阻塞的。因为主线程有一段时间要等待另一个线程处理

可以考虑3个线程
主线程负责界面
另外2个线程,一个负责读,一个负责写,然后用event同步下就行了
dirdirdir3 2008-10-27
  • 打赏
  • 举报
回复
PostMessage不会出现一个消息没处理完,下一个又来的问题........不过如果发送的消息太多没有处理的话就会有问题.
可以用一个Event等来通知主线程处理完消息,主线程再发送.
或者主线程把发送的速度放慢一些,Sleep(xxx)等.
sys0004 2008-10-27
  • 打赏
  • 举报
回复
添加事件,在PosetThreadMessage后等待事件。在写线程写完文件后设置事件。

15,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧