CircleBuf
#include<stdio.h> #include<string.h> #include<stdlib.h> #include "Semaphore.h" #include "Mutex.h" class CCircleBuf { public: CCircleBuf() { m_state = false; } ~CCircleBuf() { } public: int Initial(int size) { if (m_state == true) { printf("it's already initial!\n"); return -1; } if(size & (size -1)) { printf("buffer size must be 2 Power\n"); return -1; } m_size = size; m_in = m_out = 0; m_buf = new unsigned char[size]; memset(m_buf, 0 , sizeof(size)); m_mutex.Create(); m_state = true; return 0; } int Destroy() { return 0; } unsigned short fifo_read(char *buf,unsigned short len) { m_mutex.lock(); unsigned short node_len = 0; if (0 == GetUsedlen()) { printf("********** there is no data to read!\r\n"); m_mutex.unlock(); } //读取数据长度 if (0 == Read((char*)&node_len, sizeof(node_len))) { printf("********** get node_len faild!\r\n"); m_mutex.unlock(); return 0; } //读取数据内容 if (len < node_len) { printf("********** buf size is small!\r\n"); m_mutex.unlock(); return 0; } if (0 == Read( buf, node_len)) { printf("********** get node_content faild!\r\n"); m_mutex.unlock(); return 0; } //优化,如果数据读取完毕则重置m_in,m_out if (0 == GetUsedlen()) { m_in = m_out = 0; } m_mutex.unlock(); return len; } unsigned short fifo_write(char *buf,unsigned short len) { m_mutex.lock(); if (GetUsedlen() + sizeof(len) + len > m_size) { printf("********** the room of buf is full!\r\n"); m_mutex.unlock(); return 0; } //写入文件长度 Write((char*)&len,sizeof(len)); //写入数据内容 Write(buf,len); m_mutex.unlock(); return len; } protected: unsigned short Read(char *buf,unsigned short len) { //获取使用空间大小 unsigned short used_size = GetUsedlen(); len = min(len,used_size); unsigned short lelf = min(len,m_size - m_out &(m_size -1)); memcpy(buf,m_buf + (m_out & (m_size -1)),lelf); memcpy(buf + lelf ,m_buf, len - lelf); m_out += len; return len; } unsigned short Write(char *buf,unsigned short len) { //获取使用空间大小 unsigned short used_size = GetUsedlen(); len = min(len , m_size - used_size); unsigned short lelf = min(len, m_size - (m_in &(m_size - 1))); memcpy(m_buf + (m_in &(m_size - 1)), buf, lelf); memcpy(m_buf, buf + lelf, len -lelf); m_in += len; return len; } unsigned short GetUsedlen() { return m_in - m_out; } private: bool m_state; unsigned char *m_buf; unsigned short m_size; unsigned short m_in; unsigned short m_out; Tools::Mutex m_mutex; }; DWORD WINAPI ThreadRead(LPVOID lparam) { char temp[1024] = {'\0'}; char buf[128] = {'\0'}; while(1) { memset(temp, 0 , sizeof(temp)); memset(buf, 0 , sizeof(buf)); if (gCircleBuf.fifo_read(buf,sizeof(buf)) > 0 ) { sprintf(temp,"read data:%s\r\n",buf); OutputDebugString(temp); } Sleep(1*1000); } return 0; } DWORD WINAPI ThreadWrite(LPVOID lparam) { srand(time(NULL)); while (1) { char buf[128] = {'\0'}; sprintf(buf,"(%d)",rand()); gCircleBuf.fifo_write(buf,strlen(buf)); Sleep(1*1000); } return 0; } int main() { gCircleBuf.Initial(1024); char *temp = new char[128]; unsigned short tt = 65535*2; unsigned short t1 = 65527; unsigned short t2 = 915; unsigned short t3 = 11; unsigned short t = min(t3,(t2-t1)); unsigned short offset = t2 - t1; HANDLE hTread1 = ::CreateThread(NULL, 0 , ThreadRead, NULL, 0 , NULL); HANDLE hTread2 = ::CreateThread(NULL, 0 , ThreadWrite, NULL, 0 , NULL); CloseHandle(hTread1); CloseHandle(hTread2); system("Pause"); return 0; }
#pragma once #include <windows.h> namespace Tools { class Semaphore { public: HANDLE m_handle; bool m_state; public: Semaphore():m_state(false),m_handle(NULL){} ~Semaphore(){ Destroy(); } int Create(unsigned short nInitialCount = 0, unsigned short nMaximumCount = 0xffff) { if (!m_state) { m_state = true; if (nInitialCount > nMaximumCount) { printf("param error!\r\n"); return -1; } m_handle = CreateSemaphore(NULL, nInitialCount, nMaximumCount, NULL ); if (NULL == m_handle) { printf("[%s %d] GetLastError:%d\r\n",__FUNCTION__,__LINE__,GetLastError()); return -1; } return 0; } return -1; } int Destroy() { if (m_state) { CloseHandle(m_handle); m_handle = NULL; m_state = false; return 0; } return -1; } int Signal() { if (m_state) { if (NULL == ReleaseSemaphore(m_handle,1,NULL)) { printf("[%s %d] GetLastError:%d\r\n",__FUNCTION__,__LINE__,GetLastError()); return -1; } return 0; } return -1; } int Wait() { if (m_state) { return Wait(INFINITE); } return -1; } int Wait(DWORD dwTime) { if (m_state) { int ret = WaitForSingleObject(m_handle,dwTime); if (WAIT_TIMEOUT == ret) { return -1; } else if (WAIT_OBJECT_0 == ret) { return 0; } else { printf("[%s %d] GetLastError:%d,ret:%d\r\n",__FUNCTION__,__LINE__,GetLastError(),ret); } } return -1; } }; }
#pragma once #include <windows.h> namespace Tools { class Mutex { public: HANDLE m_handle; bool m_state; public: Mutex():m_state(false),m_handle(NULL){} ~Mutex(){ Destroy(); } int Create() { if (!m_state) { m_handle = CreateMutex(NULL, FALSE, NULL); if (NULL == m_handle) { return -1; } } m_state = true; return 0; } int Destroy() { if (m_state) { CloseHandle(m_handle); m_handle = NULL; m_state = false; return 0; } return -1; } int unlock() { if (m_state) { if (NULL == ReleaseMutex(m_handle)) { return -1; } return 0; } return -1; } int lock() { if (m_state) { int ret = WaitForSingleObject(m_handle,INFINITE); if (WAIT_TIMEOUT == ret) { return -1; } else if (WAIT_OBJECT_0 == ret) { return 0; } } return -1; } int lock(DWORD dwTime) { if (m_state) { int ret = WaitForSingleObject(m_handle,dwTime); if (WAIT_TIMEOUT == ret) { return -1; } else if (WAIT_OBJECT_0 == ret) { return 0; } } return -1; } }; }