生产者/消费者 双缓冲/多线程 困扰了好几天的问题?

问题描述

问题描述:C#编写的应用,需要从采集设备读取大容量数据→然后进行数据处理限制如下:1、数据采集可能需要较长时间,数据处理也需要较长时间→因此如果等采集完毕才进行处理,处理完毕再进行采集,效率就不够高;为此,我拟采用双缓冲方式:即有两个采集缓冲区A/B,当A采集满后立即采用异步方式进行数据处理,并紧接着用缓冲区B进行数据采集,采集完毕同样采用异步方式进行数据处理;2、在“数据处理”时必须确保只有一个“数据处理”过程被启用。(如果用生产者/消费者来描述的话应该说任何时刻只能有1个消费者)我现在实现时出现的问题://缓冲区声明int[]bufferA,bufferB;//设缓冲区大小均为4096//同步变量AutoResetEventautoEvent1,autoEvent2;//初始化时参数为(true,即非终止状态)//等待句柄数组WaitHandle[]waitHandles={autoEvent1,autoEvent2};///////////////////数据采集线程函数/////////////////voidDataRequest(){while(true){intnIndex=WaitHandle.WaiAny(waitHandles);if(nIndex==0){//从设备采集数据到bufferA........................................................//发消息通知处理线程进行“数据处理”:采用Win32API函数PostMessage(HWND,MSG1,wParam,lParam)//这里没有采用SendMessage函数是我认为SendMessage是同步调用,这样在“数据处理”完成前就不能继续采集数据了}elseif(nIndex==1){//从设备采集数据到bufferB........................................................//发消息通知处理线程进行“数据处理”:采用Win32API函数PostMessage(HWND,MSG2,wParam,lParam)//这里没有采用SendMessage函数是我认为SendMessage是同步调用,这样在“数据处理”完成前就不能继续采集数据了}}}////////////////重写WinForm的WndProc消息处理函数//////////////protectedoverridevoidWndProc(MSGm){if(m.Msg==MSG1){BufferADataProcess();}elseif(m.Msg==MSG2){BufferBDataProcess();}}///////////////数据处理线程函数:处理A缓冲区数据/////////////voidBufferADataProcess(){//数据处理..................................//释放一个句柄,以便数据采集可以进行autoEvent1.Set();}///////////////数据处理线程函数:处理B缓冲区数据/////////////voidBufferBDataProcess(){//数据处理..................................//释放一个句柄,以便数据采集可以进行autoEvent2.Set();}///////////////////////////////////////////现在的问题///////////////////////////////////////////现在的问题///////////////////////////////////////////现在的问题1、由于数据采集线程采集数据较快,导致发送消息PostMessage比较快,这样导致有可能有多个“数据处理”过程被同时调用,这违反了上述规则2,导致系统无法工作!===================================================>如何解决该问题?即如何确保“数据处理”只有一个被PostMessage消息启动?

解决方案

解决方案二:
如果不用postmessage呢?是否可以把数据保存到hashtable或者dictionary里面,然后采集线程就不停的往这个里面加数据然后你的处理线程就不停的处理相关的数据,这样可能会到点吧?或者你发消息的时候给消息定义一个规则就是当某些消息存在(也就是你的处理线程还在使用中的情况)此时暂停发送消息,一直到你的线程处理好数据以后,发消息告诉你的程序,采集线程启动
解决方案三:
参考http://blog.csdn.net/ghj1976/archive/2000/12/17/3257.aspxhttp://blog.csdn.net/skyjacker/archive/2007/01/04/1473378.aspxhttp://blog.csdn.net/liuya1985liuya/archive/2006/10/29/1355131.aspx
解决方案四:
盼高手指点一二为谢!!!
解决方案五:
up
解决方案六:
在数据采集完成,准备发消息通知数据处理的时候,先检查另一个数据采集的同步变量。A数据采集完成,先检查B的同步变量。B数据采集完成,先检查A的同步变量。即,进入A数据处理的条件是,B数据处理完成。voidDataRequest(){while(true){intnIndex=WaitHandle.WaiAny(waitHandles);if(nIndex==0){//从设备采集数据到bufferA........................................................autoEvent2.WaiteOne();//发消息通知处理线程进行“数据处理”:采用Win32API函数PostMessage(HWND,MSG1,wParam,lParam)//这里没有采用SendMessage函数是我认为SendMessage是同步调用,这样在“数据处理”完成前就不能继续采集数据了}elseif(nIndex==1){//从设备采集数据到bufferB........................................................autoEvent1.WaiteOne();//发消息通知处理线程进行“数据处理”:采用Win32API函数PostMessage(HWND,MSG2,wParam,lParam)//这里没有采用SendMessage函数是我认为SendMessage是同步调用,这样在“数据处理”完成前就不能继续采集数据了}}}
解决方案七:
首次执行需要处理一下吧
解决方案八:
本来我以为通过PostMessage给主窗口的WndProc可以实现:WndProc函数会阻止多个Message到来时按顺序执行完一个才执行下一个Message,谁知WndProc好像会让多个Message都起来,从而在主线程中同时调用多个消息处理函数,导致结果不对!...............................是这样的吗???

时间: 2024-11-05 14:41:01

生产者/消费者 双缓冲/多线程 困扰了好几天的问题?的相关文章

【Python之旅】第六篇(五):生产者消费者模型实现多线程异步交互

 虽然标题是"生产者消费者模型实现多线程异步交互",但这里要说的应该还包括Python的消息队列,因为这里多线程异步交互是通过Python的消息队列来实现的,因此主要内容如下: 1 2 3 4 1.生产者消费者模型:厨师做包子与顾客吃包子 2.Python的消息队列 3.利用消息队列实现Python多线程异步交互 4.再谈耦合度的问题 1.生产者消费者模型     通过厨师做包子与顾客吃包子来引出生产者消费者模型,如下图:     这里,厨师相当于生产者,顾客相当于消费者,顾客吃包子,

生产者消费者问题-秒杀多线程中生产者与消费者问题并行问题

问题描述 秒杀多线程中生产者与消费者问题并行问题 在模仿博文秒杀多线程问题生产者与消费者问题写多线程程序,实现了多线程的编程,但是有没有实现多线程的并行处理呢?体现在哪里?理论上是不是仍是串行实现?求大神指教 解决方案 你说的是哪一篇博客中的代码,贴一下链接 解决方案二: [多线程](九)生产者消费者问题

java多线程解决生产者消费者问题_java

本文实例讲述了java多线程解决生产者消费者问题的方法.分享给大家供大家参考.具体分析如下: 题目是这样的: 采用Java 多线程技术,设计实现一个符合生产者和消费者问题的程序.对一个对象(枪膛)进行操作,其最大容量是12颗子弹.生产者线程是一个压入线程,它不断向枪膛中压入子弹:消费者线程是一个射出线程,它不断从枪膛中射出子弹. 要求: (1)给出分析过程说明. (2)程序输出,要模拟体现对枪膛的压入和射出操作: (2)设计程序时应考虑到两个线程的同步问题. 这个和著名的生产者消费者问题几乎是一

Linux线程编程之生产者消费者问题

前言 本文基于顺序循环队列,给出Linux生产者/消费者问题的多线程示例,并讨论编程时需要注意的事项.文中涉及的代码运行环境如下: 本文假定读者已具备线程同步的基础知识. 一  顺序表循环队列 1.1 顺序循环队列定义 队列是一种运算受限的先进先出线性表,仅允许在队尾插入(入队),在队首删除(出队).新元素入队后成为新的队尾元素,元素出队后其后继元素就成为队首元素. 队列的顺序存储结构使用一个数组和两个整型变量实现,其结构如下: 1 struct Queue{ 2     ElemType el

用Python多线程实现生产者消费者模式

什么是生产者消费者模式 在软件开发的过程中,经常碰到这样的场景: 某些模块负责生产数据,这些数据由其他模块来负责处理(此处的模块可能是:函数.线程.进程等).产生数据的模块称为生产者,而处理数据的模块称为消费者.在生产者与消费者之间的缓冲区称之为仓库.生产者负责往仓库运输商品,而消费者负责从仓库里取出商品,这就构成了生产者消费者模式. 结构图如下: 为了大家容易理解,我们举一个寄信的例子.假设你要寄一封信,大致过程如下: 你把信写好--相当于生产者生产数据 你把信放入邮箱--相当于生产者把数据放

生产者消费者问题 伪代码和C语言多线程实现

生产者消费者问题是操作系统中的一个经典的问题. 他描述的是一个,多个生产者与多个消费者共享多个缓冲区的事情,具体的定义百度. 然后看了操作系统的书籍如何解决书上给的伪代码是这样的 item B[k]; semaphore empty; empty=k; //可以使用的空缓冲区数 semaphore full; full=0; //缓冲区内可以使用的产品数 semaphore mutex; mutex=1; //互斥信号量 int in=0; //放入缓冲区指针 int out=0; //取出缓冲

[Java] 多线程下生产者消费者问题的五种同步方法实现

版权声明:请尊重个人劳动成果,转载注明出处,谢谢! 目录(?)[+] 生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题.    生产者消费者模式的优点 - 解耦 - 支持并发 - 支持忙闲不均 解决方法可分为两类:   (1)用信号量和锁机制实现生产者和消费者之间的同步:    - wait() / notify()方法  - await() / signal()方法  - BlockingQueue阻塞队列方法  - Semaphore方法    (2)在生产者和消费者之间建立一

java多线程,生产者消费者问题.

问题描述 java多线程,生产者消费者问题. 新手,在试着生产者消费者问题,刚开始的时候,SyncStack为空,但是会出现先执行c那个线程,打印出eat 0.然后才是produce: 0.jdk1.8的环境. 这个是为什么呀 public class ProducerConsumer{ public static void main(String[] args){ SyncStack ss = new SyncStack(); Producer p = new Producer(ss); Co

关于双缓冲绘图的困扰 求大神帮助

问题描述 这个是困扰我很久的问题,代码如下,绘图试图用双缓冲技术,在RollBall这个继承Frame的时候,一切正常,说明线程里的repaint()方法是去调用update()了:但如果在RollBall继承的是JFrame时,我发现线程里的repaint()是绕过update()而直接调用paint()方法去了.我想用继承JFrame的方法就能实现这个无闪烁的绘图,但不知道问题出在哪里,请求各位帮助,谢谢了!!packagedefaultPackage;importjava.awt.*;im