双缓冲的誉抄的过程

原创 2016年06月01日 19:28:08

程序一利用双缓冲、三线程的串行执行实现从输入文件到屏幕的拷贝输出:

代码如下:

#include<windows.h>

#include<iostream>

using namespacestd;

FILE *infile;

char buf1,buf2;

void get(){buf1=fgetc(infile);}

void copy(){buf2=buf1;}

void put( ){putchar(buf2);}

int main()

{

      infile=fopen("in.txt","r");

for(;buf1!=EOF;)

      {

           get();

           copy();

           put();

      }

fclose(infile);

return 0;

}



程序二实现线程的随机并发执行:

代码如下:

#include <cstdio>

#include "conio.h"

#include "windows.h"

#include <iostream>

using namespace std;

typedef struct _THREADDATA

{

      FILE*infile;

      char*buf1;

      char*buf2;

}*LPTHREADDATA, THREADDATA;

DWORD WINAPI get(LPVOID lParam)

{

   LPTHREADDATA pData = (LPTHREADDATA)lParam;

for (;*pData->buf1!=EOF;)

      {

           *pData->buf1=fgetc(pData->infile);    

           Sleep(1);

      }

 return 0;

}

DWORD WINAPI copy(LPVOID lParam)

{

LPTHREADDATA pData = (LPTHREADDATA)lParam;

for (;*pData->buf1!=EOF;)

      *pData->buf2=*pData->buf1;

      return0;

}

DWORD WINAPI put(LPVOID lParam)

{

   LPTHREADDATA pData = (LPTHREADDATA)lParam;

for (;*pData->buf1!=EOF;)

      {

           cout<<*pData->buf2<<endl;

           Sleep(1);

      }

return 0;

}

int main()

{

      FILE*infile=fopen("in.txt","r");

      charbuf1,buf2;

   LPTHREADDATA pData = new THREADDATA;

      pData->infile=infile;

      pData->buf1=&buf1;

      pData->buf2=&buf2;;

DWORD ThreadId1,ThreadId2,ThreadId3;

      ::CreateThread(NULL,0, get, (LPVOID)pData, 0, &ThreadId1);    

      ::CreateThread(NULL,0, copy, (LPVOID)pData, 0, &ThreadId2); 

      ::CreateThread(NULL,0, put, (LPVOID)pData, 0, &ThreadId3);      

getch();

      fclose(infile);

return0;

}


程序三控制进程实现正确的并发誊抄:

代码如下:

#include <cstdio>

#include "conio.h"

#include "windows.h"

#include <iostream>

using namespace std;

HANDLE Mutex;

HANDLE buf1_e;

HANDLE buf1_f;

HANDLE buf2_e;

HANDLE buf2_f;

typedef struct _THREADDATA

{

      FILE*infile;

      char*buf1;

      char*buf2;

}*LPTHREADDATA, THREADDATA;

DWORD WINAPI get(LPVOID lParam)

{

      LPTHREADDATApData = (LPTHREADDATA)lParam;

for (;*pData->buf1!=EOF;)

      {

           WaitForSingleObject(buf1_e,INFINITE);

           *pData->buf1=fgetc(pData->infile);    

           ReleaseSemaphore(buf1_f,1,NULL);

      }

 return 0;

}

 

DWORD WINAPI copy(LPVOID lParam)

{

      LPTHREADDATApData = (LPTHREADDATA)lParam;

for (;*pData->buf1!=EOF;)

      {

           WaitForSingleObject(buf1_f,INFINITE);

           WaitForSingleObject(buf2_e,INFINITE);

           *pData->buf2=*pData->buf1;

           ReleaseSemaphore(buf1_e,1,NULL);

           ReleaseSemaphore(buf2_f,1,NULL);

      }

return 0;

}

DWORD WINAPI put(LPVOID lParam)

{

      LPTHREADDATApData = (LPTHREADDATA)lParam;

for (;*pData->buf1!=EOF;)

      {

           WaitForSingleObject(buf2_f,INFINITE);

           cout<<*pData->buf2;

           ReleaseSemaphore(buf2_e,1,NULL);

      }

return 0;

}

int main()

{

 //  Mutex=CreateMutex(NULL,FALSE,NULL);  

      buf1_e=CreateSemaphore(NULL,1,1,NULL);

      buf1_f=CreateSemaphore(NULL,0,1,NULL);

      buf2_e=CreateSemaphore(NULL,1,1,NULL);

      buf2_f=CreateSemaphore(NULL,0,1,NULL);

      FILE*infile=fopen("in.txt","r");

      charbuf1,buf2;

   LPTHREADDATA pData = new THREADDATA;

      pData->infile=infile;

      pData->buf1=&buf1;

      pData->buf2=&buf2;

   DWORDThreadId1,ThreadId2,ThreadId3;

      ::CreateThread(NULL,0, copy, (LPVOID)pData, 0, &ThreadId2); 

      ::CreateThread(NULL,0, put, (LPVOID)pData, 0, &ThreadId3);      

      ::CreateThread(NULL,0, get, (LPVOID)pData, 0, &ThreadId1);    

getch();

      fclose(infile);

   return 0;

}


版权声明:本文为博主原创文章,未经博主允许不得转载。

GDI圆形双缓冲实时进度条

  • 2014年12月26日 09:46
  • 63KB
  • 下载

基于双缓冲的DMX512协议

  • 2016年01月29日 17:43
  • 61KB
  • 下载

MFC VC 双缓冲绘图基本原理与实现,详细解释

MFC VC 双缓冲绘图基本原理与实现,详细解释 MFC做了一些时间了,不得不面对 的是在界面上画图的。 当然你可以直接搜索到能用的代码,并且基本能满足要求。不过这样总不是学习的态度。本着学习...

CDC双缓冲防闪屏绘图总结

  • 2012年12月17日 21:14
  • 29KB
  • 下载

俄罗斯方块_带双缓冲绘图

  • 2015年05月17日 16:11
  • 4KB
  • 下载

GDI+ PNG图片 双缓冲&半透明图片绘图发黑解决

双缓冲显示PNG图片 核心是在内存DC中显示图片。 1.      首先要开辟出来一块内存以作DC用。 CDC MemDC; 2.      给内存DC赋以一定的物理属性。不同于物理DC,内存...

双缓冲画图拖动问题

  • 2007年11月14日 12:49
  • 37KB
  • 下载

MFC基础知识(四)——双缓冲解决刷屏时闪烁

本文主要介绍:在利用MFC画图或图像显示时,有时候需要调用OnDraw()函数刷新屏幕,而屏幕往往会发生闪烁,本文主要介绍利用双缓冲解决闪屏问题。 关于闪屏方面的介绍分析见博文: http://b...

双缓冲和欢迎界面

  • 2008年06月07日 09:47
  • 543KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:双缓冲的誉抄的过程
举报原因:
原因补充:

(最多只允许输入30个字)