- 浏览: 637322 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
sztime:
可以在文本框上绑定事件来禁用回车键, 我就是这样做的.在IE中 ...
form 回车自动提交问题 -
damoqiongqiu:
非常好的文章,很透彻不过有一句话小僧腆着脸补充一下:“1111 ...
为什么要用补码来做存储 -
wuyizhong:
原来如此啊。
form 回车自动提交问题 -
luliangy:
谢楼主~!
用C语言扩展Python的功能 -
kwong:
很有用,谢谢
火狐和IE 对css 样式解释的差异
/** * Copyright (c) 2008, ×××研发中心 * All rights reserved. * * 名 称: * 摘 要: * 作 者:test * 版 本:1.0 * 时 间:08.08.27 16:21:55 */ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <pthread.h> #include <time.h> #define INITBUFSIZE 10 /*环型缓冲区初始单元个数*/ #define UNITSIZE 200/*每单元大小*/ using namespace std; /*global data*/ /*Cirbuf chain 写进程可能很快 以至于不只有1个或2个环形缓冲,可能有多个*/ struct Cirbuf* packetCirbuf; /*环形缓冲的一个单元*/ struct CirUnit { int flag; /*0 表明可写,1表明可读*/ char unit[UNITSIZE]; }; /*环形缓冲*/ struct Cirbuf { struct Cirbuf * newBuf; /*point to new Cirbuf*/ int readPoint; /*for reading thread*/ int writePoint; /*for writing thread*/ int bufSize; /*buf char array's size*/ struct CirUnit *buf; /*point to unit array*/ }; struct Cirbuf* GetNewCirbuf(int bufSize,struct Cirbuf* oldBuf) { if(bufSize>30000) { printf("oh my god,the bufSize is out of my league,I cannot handle it,exit"); exit(1); } struct Cirbuf* newBuf = new Cirbuf(); printf("new buffer %d\n",bufSize); usleep(1000000); if(oldBuf != NULL) oldBuf->newBuf = newBuf; newBuf->newBuf = NULL; newBuf->readPoint = newBuf->writePoint = 0; newBuf->bufSize = bufSize; newBuf->buf = new CirUnit[bufSize]; memset(newBuf->buf,0,sizeof(CirUnit)*bufSize); /*初始化单元为0*/ return newBuf; } int FreeCirbuf(struct Cirbuf* bufPoint) { delete bufPoint->buf; delete bufPoint; printf("delete buffer \n"); return 1; } void DoWrite(struct Cirbuf* latestBuf,char flag) { latestBuf->buf[latestBuf->writePoint].unit[0] = flag; printf("write %d \n",flag); } void DoRead() { printf("read %d \n",packetCirbuf->buf[packetCirbuf->readPoint].unit[0]); } extern "C" void* ReadThread(void *arg) { while(1) { usleep(200000); if(packetCirbuf->buf[packetCirbuf->readPoint].flag == 0) { if(packetCirbuf->newBuf != NULL) { /*表明readthread已经处理完旧的缓冲区并且已经有新的缓冲区,这时应该释放旧缓冲*/ struct Cirbuf *temp = packetCirbuf; packetCirbuf = packetCirbuf->newBuf; FreeCirbuf(temp); continue; } /* delay*/ pthread_cond_t mycond = PTHREAD_COND_INITIALIZER; pthread_mutex_t mymutex = PTHREAD_MUTEX_INITIALIZER; struct timespec ts; int rv; ts.tv_sec = 0; ts.tv_nsec = 50000; /* 500,00 nanoseconds = 50 ms */ pthread_mutex_lock(&mymutex); rv = pthread_cond_timedwait(&mycond, &mymutex, &ts); pthread_mutex_unlock(&mymutex); continue; } DoRead(); packetCirbuf->buf[packetCirbuf->readPoint].flag = 0; if(++packetCirbuf->readPoint == packetCirbuf->bufSize) packetCirbuf->readPoint = 0; } return NULL; } extern "C" void* WriteThread(void *arg) { struct Cirbuf* latestBuf; /*进写进程后,初始化latestBuf指针 使其指向packetCirbuf,这时的packetCirbuf是由主线程函数创建的初始buf*/ latestBuf = packetCirbuf; if(latestBuf == NULL) { cout << "packet capture buffer NULL error" << endl; exit(0); } /*进入循环*/ char test=0; while(1) { usleep(100000); if (latestBuf->buf[latestBuf->writePoint].flag == 1) { /*we need a larger buf*/ latestBuf = GetNewCirbuf(latestBuf->bufSize * 2,latestBuf); } else { DoWrite(latestBuf,test++); latestBuf->buf[latestBuf->writePoint].flag = 1; if(++latestBuf->writePoint == latestBuf->bufSize) latestBuf->writePoint = 0; } if(test == 127) break; } return NULL; } int main(int argc, char *argv[]) { pthread_t threadNum[2]; packetCirbuf = GetNewCirbuf(INITBUFSIZE,NULL); pthread_create(&threadNum[0],NULL,WriteThread,NULL); pthread_create(&threadNum[1],NULL,ReadThread,NULL); pthread_join(threadNum[0],NULL); pthread_join(threadNum[1],NULL); FreeCirbuf(packetCirbuf); }
见到的一个不错的环形缓冲。
发表评论
-
strlcpy 的历史
2012-11-05 18:51 633strlcpy 并不属于 ANSI C,至今也还不是标准 ... -
c中的移位操作
2012-04-12 18:18 861位移位运算符是将数据看成二进制数,对其进行向左或向 ... -
为什么要用补码来做存储
2012-04-12 18:02 2174看了些补码的知识,摘抄了些,自己整理了些。 顺便带着两个 ... -
google test 使用
2009-01-03 13:59 3503安装: 下载Google C++ Testi ... -
string 的 data() 和c_str()
2008-12-24 01:17 1155data 是字符数组,里面有 '\0 '当然也不会 ... -
C/C++ unit testing tools (18 found)
2008-12-19 01:27 1941C/C++ unit testing tools (18 f ... -
climits中的符号常量
2008-12-10 11:43 1115climits中的符号常量 符号常量 ... -
ICE初次
2008-09-02 01:48 1815按照某人的说法:跨平台的C++网络编程ICE才是王道。于是,我 ... -
对 pthread_cond_wait 的错误理解
2008-08-28 15:52 2059在线程的调度中经常会用到 pthread_cond_wait ... -
Linux下C语言编程的 RPC远程调用编程
2008-07-17 15:38 3372在查看libc6-dev软件包提供的工具(用 dpkg -L ... -
C++中重载操作符时什么时候定义成友元,什么时候定义为成员方法
2008-07-10 18:05 3500在C++语言中,可以用关键字operator加上运算符来表示函 ... -
c++中的存储类型
2008-07-06 00:46 1882存储类型是从变量的存 ... -
libevent 一个time server
2008-05-19 11:20 1266#include <netinet/in.h> # ... -
自己动手改写komodo sourcetree插件 对C/C++的支持
2008-04-16 22:11 1360其实很简单了, 找到sourcetree.js 的 ... -
GNU C的 __attribute__ 机制
2008-04-15 15:34 735GNU C 的一大特色(却不被初学者所知)就是 __attri ... -
module的认识和写法
2008-04-15 15:29 666不知道在什幺时候,Linux 出现了 module 这种东西, ... -
dynamic_cast、static_cast、const_cast 和 reinterp
2008-04-10 15:16 1348dynamic_cast、static_cast、co ... -
static_cast、dynamic_cast、reinterpret_cast、和const_c
2008-04-10 15:14 6195static_cast、dynamic_cast、reinte ... -
关于Linux下C/C++程序编译
2007-08-23 18:15 3634在编译之前我们需要 ... -
使用 setfill、setw 和 setprecision 基数的示例
2007-08-23 19:00 2692使用 setfill、setw 和 setprecision ...
相关推荐
在通信程序中,经常使用环形缓冲区作为数据结构来存放通信中发送和接收的数据。环形缓冲区是一个先进先出的循环缓冲区,可以向通信程序提供对缓冲区的互斥访问。
labview 的环形缓冲区组件,在NI 官网上找到的。强大的功能哦,比labview 自带的好
STM32F103ZET6芯片,配置串口,创建环形缓冲,通过串口收发,可以做到无丢包,STM32F103ZET6芯片,配置串口,创建环形缓冲,通过串口收发,可以做到无丢包,STM32F103ZET6芯片,配置串口,创建环形缓冲,通过串口...
功 能:环形缓冲区 优 点:相对于队列来说减少了很多对地址的反复操作,增加稳定性。 作 者:XadillaX Q Q:8644325 说 明: | 构造: CircleBuffer<类型名> //构造时可选参数环形缓冲区大小,默认65535个元素 | ...
无锁 环形缓冲区
环形缓冲区建立源码 环形缓冲区建立源码 环形缓冲区建立源码
C语言实现环形缓冲区,可供多线程读写操作
使用环形存储缓冲区实现串口通讯的接收 ,环形缓冲存储区源代码
设计了一个环形字节缓冲区类,可用于通信数据收发的缓冲处理。类的读写及查看接口已经加上了多线程同步访问锁
环形缓冲区组件主要用于完成数据的缓存以及数据的解析,数据的缓存以及数据的解析,都只需一句话。高度封装的串口控件里面添加了环形缓冲区组件,控件中添加了一个处理解析好的数据的事件,用于只需要在这个事件中...
环形缓冲器在频发事件中的应用。。。。。。。。
1.高速通信下,环形缓冲区设计及实现;可直接使用演示。 2.包括:服务端和客户端。说明:SOCKET通信非常简略,只为环形缓冲区测试使用,也适合初学都学习。 其他:里面包含SOCKET通信客户端/服务器演示,还包括了...
该工程包含了整个实现代码,并添加了注释,提供了软件计时器多任务创建及调度接口函数,以及环形缓冲区完整接口函数。
环形缓冲 串口自发自收 STM32 C程序 可用于上位机与下位机通信.
环形缓冲区读写操作的分析与实现.。。。。。。。。。。。
环形缓冲区实现类(RingBuffer)
STM32进阶之串口环形缓冲区实现 FIFO,代码精简,易实现。
Delphi实现的环形缓冲区,有详细的注释说明和示意图,请大家给提出更为高效,简单的改进意见。 添加可以自动扩展大小的功能
用C++封装好的一个环形缓冲区代码,各位需要的可以拿去