双缓冲的誉抄的过程

原创 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;

}


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

誉天邹老师RHCVA-红帽虚拟化视频(1-6集)下载

誉天邹老师RHCVA-红帽虚拟化视频(1-6集) 誉天邹老师RHCVA-001.RHCVA及虚拟化技术介绍.rar 誉天邹老师RHCVA-002.RHEV-M介绍及安装.rar 誉天邹老师RHCVA...
  • u011501221
  • u011501221
  • 2013年08月26日 21:59
  • 2035

Delphi中在TForm绘图时使用DoubleBuffered实现双缓冲的副作用

在使用TForm的DoubleBuffered属性实现双缓冲时,如果TForm中同时包含了TToolBar控件,在运行时TToolBar控件可能变黑,这应该是Delphi的一个bug;所以这个时候创建...
  • lcfeng1982
  • lcfeng1982
  • 2012年06月11日 16:10
  • 6646

如何优雅的抄袭代码?天下代码一大抄,这才是正确的姿势

【回复“1024”,送你一个特别推送】 你们知道程序员最熟悉,最熟练,最常用的两个快捷键是哪两个吗?没错,估计你现在心中所想的就是:ctrl+c 和 ctrl+v ,俗名为:复制和粘贴。对于...
  • OQjya206rsQ71
  • OQjya206rsQ71
  • 2017年12月03日 00:00
  • 2853

C# 绘图双缓冲技术总结

GDI+的双缓冲问题终于搞定了, 真是松了一口气! 一直以来的误区:.net1.1 和 .net 2.0 在处理控件双缓冲上是有区别的。 .net 1.1 中,使用:this.SetSty...
  • snakorse
  • snakorse
  • 2015年03月31日 17:32
  • 747

NB-IoT在远程抄表中的应用

水气表和我们的生活息息相关,每家每户都会使用,最原始的方法是,人工上门抄表统计数据.   随着社会的发展,人工抄表衍生出各种弊端:  效率低  人工成本高  记录数据易出错 ...
  • langshi_2011
  • langshi_2011
  • 2018年01月03日 11:51
  • 95

Outlook 自动发送 密抄 自己 可多人密抄

这个需要用到宏的,具体步骤如下: 1、在Outlook里面键入ALT+F11打开VBA编辑器; 2、键入CTRL+R激活左边的那个工程面板,展开并双击上面的“Project (VbaProjec...
  • five824
  • five824
  • 2012年02月09日 10:31
  • 1555

几款抄板软件的比较

1、 BMP2PCB。 最早期的抄板软件,实际上只是一个bmp转成pcb的软件,现在已经被淘汰了! 特点:扫描后的bmp转为pcb文件然后在99se或AD上画图。 缺点:a,如果bmp文件太大...
  • qq_29545231
  • qq_29545231
  • 2017年12月10日 15:05
  • 351

在搜索领域,我是他们的老师,谷歌抄袭百度的技术

中新网电 近日,一份百度创始人李彦宏早年间发表于国际权威学术期刊PAMI的论文在国内计算机工程师中悄然流传。有调查显示,这篇1996年发表的论文主要聚焦于OCR(光学字识别)模型选择和集成问题,成文于...
  • shuanghusun
  • shuanghusun
  • 2016年04月27日 09:39
  • 664

对Qt中双缓冲绘图的理解

对Qt中双缓冲绘图的理解 原教程 :http://bbs.qter.org/forum.php?mod=viewthread&tid=120&extra=page%3D1%26filter%3D...
  • qq_23853503
  • qq_23853503
  • 2017年01月22日 15:54
  • 370

什么是PCB抄板?主要抄板软件有哪些?

PCB抄板,是在已经有电子产品实物和电路板实物的前提下,利用反向研发技术手段对电路板进行逆向解析,将原有产品的PCB文件、物料清单(BOM)文件、原理图文件等技术文件以及PCB丝印生产文件进行1:1的...
  • pcb_honglijie
  • pcb_honglijie
  • 2016年09月21日 13:27
  • 2558
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:双缓冲的誉抄的过程
举报原因:
原因补充:

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