首页 > 系统相关 >Windows 新建缓冲区应对高速闪屏问题

Windows 新建缓冲区应对高速闪屏问题

时间:2024-10-07 16:01:38浏览次数:9  
标签:Windows hOutput int 闪屏 cci Flush 缓冲区 size

高速使用 system("cls") 会导致非常严重的闪屏

新建第二个缓冲区即可解决该问题,操作分为两步,打开缓冲区开关,以及将缓冲区内容输出到控制台

一份无优化的用来比对效果的代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    while(1){
        for(int i='a';i<='z';++i){
            putchar(i);
        }
        system("cls");
    }
}

双缓冲代码

#include<bits/stdc++.h>
#include<windows.h>
HANDLE hOutput;
COORD coord={0,0};
HANDLE hOutBuf=CreateConsoleScreenBuffer(
    GENERIC_READ | GENERIC_WRITE, 
    FILE_SHARE_READ | FILE_SHARE_WRITE, 
    NULL, 
    CONSOLE_TEXTMODE_BUFFER, 
    NULL
);
CONSOLE_CURSOR_INFO cci;
char data[80000];
DWORD bytes=0;
void start_cls(HANDLE hConsole=hOutput){
    COORD coordScreen={0,0}; 
    DWORD cCharsWritten;
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    DWORD dwConSize;
    if (!GetConsoleScreenBufferInfo(hConsole, &csbi)) return;
    dwConSize = csbi.dwSize.X * csbi.dwSize.Y;
    if (!FillConsoleOutputCharacter(hConsole, (TCHAR)' ', dwConSize, coordScreen, &cCharsWritten)) return;
    SetConsoleCursorPosition(hConsole, coordScreen);
}
void Flush_Screen(unsigned Flush_size){
    ReadConsoleOutputCharacterA(hOutput,data,Flush_size,coord,&bytes);
    WriteConsoleOutputCharacterA(hOutBuf,data,Flush_size,coord,&bytes);
}
void set_Flush(){
    hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleActiveScreenBuffer(hOutBuf);
    cci.bVisible=0;
    cci.dwSize=1;
    SetConsoleCursorInfo(hOutput,&cci);
    SetConsoleCursorInfo(hOutBuf,&cci);
}
void show(int Flush_size){
    Flush_Screen(Flush_size);
}
int main(){
    set_Flush(); //初始化缓冲信息
    while(1){
        start_cls(); //打开缓冲开关
        for(int c='a';c<='z';c++){
            putchar(c);
        }
        show(100);  //输出到控制台(这里一定要开够,大了可以,但是小了不行)
    }
}

标签:Windows,hOutput,int,闪屏,cci,Flush,缓冲区,size
From: https://www.cnblogs.com/HaneDaCafe/p/18450190

相关文章

  • 如何去除Windows10文件资源管理器上的6个文件夹:桌面、视频、图片、文档、下载、音乐和
    尽管 Win10 提供了迄今为止最先进和丰富的功能,但并不是每一个人都希望其预装那么多的组件。长期以来,微软通常会在Windows资源管理器中包含6个“桌面、文档、下载、音乐、图片和视频”的默认存储位置。在2017年10月的“秋季创意者更新”之后,它又增加了“3D对象”。其旨在为......
  • windows服务器IIS服务修改已绑定的网站域名
    要在Windows服务器上的IIS(InternetInformationServices)中修改已绑定的网站域名,可以按照以下步骤操作:打开IIS管理器:打开“开始”菜单,输入“InternetInformationServices(IIS)管理器”,并打开它。或者通过“服务器管理器”中的“工具”菜单打开IIS管理器。......
  • Windows应急响应-QQ巨盗病毒
    目录病毒背景样本分析开启监控感染病毒分析病毒行为C盘文件监控D盘文件监控进程监控排查服务排查启动项排查查杀1.杀掉进程2.异常服务3.映像劫持处理4.hosts文件处理5.D盘文件删除6.其他异常排查重启排查病毒背景简介:Win32.PSWTroj.QQPass,名为:【QQ伪装盗号者】是一种QQ盗号木马,......
  • windows cmd alias
    ItisrathereasytosetuppermanentaliasesintheWindowscommandpromptusingthe @DOSKEY commandand HKCU\Software\Microsoft\CommandProcessor Autorunoption.Quickstep-by-stepguide:Createanewbatchfile,callit Alias.bat.Copy/pastethetex......
  • Windows常用快捷键
    Windows常用快捷键键盘功能键Tab、Shift、Ctrl、Alt、空格、Enter、Window、↑↓←→切换输入法Ctrl+Shift打开菜单Ctrl+Windows关闭窗口Alt+F4产生间隙空格键确定键Enter键盘快捷键全选、复制、粘贴、撤销、保存、关闭窗口、运行、永久删除......全选......
  • Windows计划任务出现0x1错误结果
    Windows计划任务出现0x1错误结果现象解决方法结果 现象参考不少的文章,基本上都是说因为权限的问题,但试了N次都不行,仍然报0x1的错误结果,亲测解决方法说明如下; 1.脚本本身没问题,手动本地可以执行;2.系统版本Windows10专业工作站版版本号21H2解决方法在设......
  • Git推送自动化:在Windows上轻松设置定时任务
    简介当我们写代码/笔记每次都要自己使用git手动的提交和推送代码/笔记到远程仓库,如果电脑能每天定时的推送的话就很方便。准备在开始步骤之前,首先你的git账号关联,远程仓库什么的都关联好了,并且成功提交至远程仓库过,以防还没的步骤失败~GIt、Windows步骤1.新建一个文本文档......
  • Windows应急响应-Auto病毒
    目录应急背景分析样本开启监控感染病毒查看监控分析病毒行为autorun.inf分析2.异常连接3.进程排查4.启动项排查查杀1.先删掉autorun.inf文件2.使用xuetr杀掉进程3.启动项删除重启排查入侵排查正常流程应急背景运维人员准备通过windows共享文档方式为公司员工下发软件安装,开启完......
  • 在Windows平台使用源码编译和安装PyTorch3D指定版本
    最近在部署SyncTalk虚拟数字人项目时,需要安装很多依赖项,在执行到pipinstall--no-index--no-cache-dirpytorch3d-fhttps://dl.fbaipublicfiles.com/pytorch3d/packaging/wheels/py38_cu113_pyt1121/download.html这一句命令时,安装PyTorch3D失败,输出如下信息:(synctalk)C......
  • netsh winsock reset catalog 和 netsh int ip reset reset.log 是两个常用的 Windows
    netshwinsockresetcatalog和netshintipresetreset.log是两个常用的Windows命令,用于网络故障排除和恢复网络设置。下面是对这两个命令的详细解释:1. netshwinsockresetcatalog功能:重置Winsock目录,以修复与网络相关的问题。Winsock的作用:Winsock(WindowsSocke......