精华内容
下载资源
问答
  • 把下面这段代码放到需要解决问题的窗体中 protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.ExStyle |= 0x02000000; // 用双缓冲绘制窗口的所有子控件 ...

    把下面这段代码放到需要解决问题的窗体中

     protected override CreateParams CreateParams
            {
                get
                {
                    CreateParams cp = base.CreateParams;
                    cp.ExStyle |= 0x02000000; // 用双缓冲绘制窗口的所有子控件
                    return cp;
                }
            }

    展开全文
  • Winform 界面卡顿问题

    千次阅读 2016-10-27 14:57:00
    2019独角兽企业重金招聘Python工程师标准>>> ...
    new System.Threading.Thread(new System.Threading.ThreadStart(() =>
                {
                    //new 线程获取大量数据
                    DataTable dtt = null;
                    try
                    {//new 线程获取大量数据
                        string TTL_rs = inout.getInOutInfo_TTL_Json(" and 1=1 ");
                        dtt = JsonUtil.JsonToDataTable(TTL_rs);
                        
                    }
                    catch
                    { }
                    BeginInvoke(new System.Threading.ThreadStart(() =>
                    {
                        if (dtt == null)
                            return;
                        //如果此行在Invoke就会阻塞主线程,放在外面来执行就无忧了
                        showData(dtt);
                    }));
                }))
                { IsBackground = true }.Start();

     

    转载于:https://my.oschina.net/milu6852/blog/776532

    展开全文
  • 在form 中 ,A,B是两个label,给A界面显示内容,当耗时过长,B会卡顿。 ![图片说明](https://img-ask.csdn.net/upload/201605/05/1462429601_799159.png)
  • Winform用的GDI+,像全屏动画这种卡的稀巴烂,任务管理器看进程如果GPU没动静那就是渣,没加速。 可以使用OpenGL或者DirectX这样有GPU加速就不卡了。 OpenGL用下面这个,控件里会多出一个glControl,拖到form上 ...

    Winform用的GDI+,像全屏动画这种卡的稀巴烂,任务管理器看进程如果GPU没动静那就是渣,没加速。

    可以使用OpenGL或者DirectX这样有GPU加速就不卡了。

    OpenGL用下面这个,控件里会多出一个glControl,拖到form上

    using OpenTK.Graphics.ES20;
    using SkiaSharp;
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace SkiaDemo
    {
        public partial class Form1 : Form
        {
            Random rand = new Random();
            SKColorType colorType = SKColorType.Rgba8888;
    
            public Form1()
            {
                InitializeComponent();
    
                glControl1.VSync = false; // why?
                glControl1.Paint += new PaintEventHandler(RenderWithOpenGL);
            }
    
            private void RenderWithOpenGL(object sender, PaintEventArgs e)
            {
                Control sctl = (Control)sender;
                int width = sctl.Width;
                int height = sctl.Height;
    
                // setup the Skia surface using OpenGL
    
                GRContext contextOpenGL = GRContext.Create(GRBackend.OpenGL, GRGlInterface.CreateNativeGlInterface());
    
                GL.GetInteger(GetPName.FramebufferBinding, out var framebuffer);
                GRGlFramebufferInfo glInfo = new GRGlFramebufferInfo((uint)framebuffer, colorType.ToGlSizedFormat());
                GL.GetInteger(GetPName.StencilBits, out var stencil);
                GRBackendRenderTarget renderTarget = new GRBackendRenderTarget(width, height, contextOpenGL.GetMaxSurfaceSampleCount(colorType), stencil, glInfo);
    
                SKSurface surface = SKSurface.Create(contextOpenGL, renderTarget, GRSurfaceOrigin.BottomLeft, colorType);
    
                // Draw some stuff on the canvas
    
                surface.Canvas.Clear(SKColor.Parse("#FFFFFF")); // adds about 3ms fullscreen
    
                byte alpha = 128;
                var paint = new SKPaint();
                for (int i = 0; i < 1_000; i++)
                {
                    float x1 = (float)(rand.NextDouble() * width);
                    float x2 = (float)(rand.NextDouble() * width);
                    float y1 = (float)(rand.NextDouble() * height);
                    float y2 = (float)(rand.NextDouble() * height);
    
                    paint.Color = new SKColor(
                            red: (byte)(rand.NextDouble() * 255),
                            green: (byte)(rand.NextDouble() * 255),
                            blue: (byte)(rand.NextDouble() * 255),
                            alpha: alpha
                        );
    
                    surface.Canvas.DrawLine(x1, y1, x2, y2, paint);
                }
    
                surface.Canvas.Flush();
                glControl1.SwapBuffers();
    
                // prevent memory access violations by disposing before exiting
                renderTarget?.Dispose();
                contextOpenGL?.Dispose();
                surface?.Dispose(); 
            }
    
            private void BtnBenchmark_Click(object sender, EventArgs e)
            {
                int count = 250;
    
                btnBenchmark.Enabled = false;
                System.Diagnostics.Stopwatch stopwatch = System.Diagnostics.Stopwatch.StartNew();
    
                progressBar1.Maximum = count;
                for (int i = 0; i < count; i++)
                {
                    lblStatus.Text = $"on render {i + 1} of {count}...";
                    progressBar1.Value = i + 1;
                    progressBar1.Value = i;
                    Application.DoEvents(); // adds about 1ms fullscreen
                    glControl1.Refresh();
                }
                progressBar1.Value = 0;
    
                double meanSec = (double)stopwatch.ElapsedTicks / System.Diagnostics.Stopwatch.Frequency / count;
                lblStatus.Text = string.Format("mean render {0:0.00} ms ({1:0.00} Hz)", meanSec * 1000, 1.0 / meanSec);
                btnBenchmark.Enabled = true;
            }
        }
    }
    

    DirectX可以用SharpDX,也有提供窗体,改造窗体等方式

    需安装SharpDX,SharpDX.Desktop,SharpDX.Direct2D1,SharpDX.DXGI,SharpDX.Mathematics

    using System;
    using SharpDX;
    using SharpDX.Direct2D1;
    using SharpDX.DirectWrite;
    using SharpDX.Windows;
    using System.Windows.Forms;
    
    using D2DFactory = SharpDX.Direct2D1.Factory;
    using DWriteFactory = SharpDX.DirectWrite.Factory;
    
    namespace AdvancedTextRenderingApp
    {
        public class CustomColorRenderer : SharpDX.DirectWrite.TextRendererBase
        {
            private RenderTarget renderTarget;
            private SolidColorBrush defaultBrush;
    
            public void AssignResources(RenderTarget renderTarget,SolidColorBrush defaultBrush)
            {
                this.renderTarget = renderTarget;
                this.defaultBrush = defaultBrush;
            }
    
            public override Result DrawGlyphRun(object clientDrawingContext, float baselineOriginX, float baselineOriginY, MeasuringMode measuringMode, GlyphRun glyphRun, GlyphRunDescription glyphRunDescription, ComObject clientDrawingEffect)
            {
                SolidColorBrush sb = defaultBrush;
                if (clientDrawingEffect != null && clientDrawingEffect is SolidColorBrush)
                {
                    sb = (SolidColorBrush)clientDrawingEffect;
                }
    
                try
                {
                    this.renderTarget.DrawGlyphRun(new Vector2(baselineOriginX, baselineOriginY), glyphRun, sb, measuringMode);
                    return Result.Ok;
                }
                catch
                {
                    return Result.Fail;
                }
            }
        }
    
        public class Program
        {        
            private static D2DFactory d2dFactory;
            private static DWriteFactory dwFactory;
            private static RenderForm mainForm;
    
            private static WindowRenderTarget renderTarget;
    
            private static TextFormat textFormat;
            private static TextLayout textLayout;
    
            //Various brushes for our example
            private static SolidColorBrush backgroundBrush;
            private static SolidColorBrush defaultBrush;
            private static SolidColorBrush greenBrush;
            private static SolidColorBrush redBrush;
    
            private static CustomColorRenderer textRenderer;
    
           
            private static RectangleF fullTextBackground;
    
            //This one is only a measured region
            private static RectangleF textRegionRect;
            
    
            private static string introText = @"Hello from SharpDX, this is a long text to show some more advanced features like paragraph alignment, custom drawing...";
    
            [STAThread]
            static void Main(string[] args)
            {
                mainForm = new RenderForm("Advanced Text rendering demo");
    
                d2dFactory = new D2DFactory();
                dwFactory = new DWriteFactory(SharpDX.DirectWrite.FactoryType.Shared);
                
                textRenderer = new CustomColorRenderer();
    
                CreateResources();
    
                var bgcolor = new Color4(0.1f,0.1f,0.1f,1.0f);
    
                //This is the offset where we start our text layout
                Vector2 offset = new Vector2(202.0f,250.0f);
    
                textFormat = new TextFormat(dwFactory, "Arial", FontWeight.Regular, FontStyle.Normal, 16.0f);
                textLayout = new TextLayout(dwFactory, introText, textFormat, 300.0f, 200.0f);
    
                //Apply various modifications to text
                textLayout.SetUnderline(true, new TextRange(0, 5));
                textLayout.SetDrawingEffect(greenBrush, new TextRange(10, 20));
                textLayout.SetFontSize(24.0f, new TextRange(6, 4));
                textLayout.SetFontFamilyName("Comic Sans MS", new TextRange(11,7));
    
                //Measure full layout
                var textSize = textLayout.Metrics;
                fullTextBackground = new RectangleF(textSize.Left + offset.X, textSize.Top + offset.Y, textSize.Width, textSize.Height);
    
                //Measure text to apply background to
                var metrics = textLayout.HitTestTextRange(53, 4, 0.0f, 0.0f)[0];
                textRegionRect = new RectangleF(metrics.Left + offset.X, metrics.Top + offset.Y, metrics.Width, metrics.Height);
    
                //Assign render target and brush to our custom renderer
                textRenderer.AssignResources(renderTarget, defaultBrush);
    
                RenderLoop.Run(mainForm, () =>
                {
                    renderTarget.BeginDraw();
                    renderTarget.Clear(bgcolor);
    
                    renderTarget.FillRectangle(fullTextBackground, backgroundBrush);
    
                    renderTarget.FillRectangle(textRegionRect, redBrush);
    
                    textLayout.Draw(textRenderer, offset.X, offset.Y);
    
                    try
                    {
                        renderTarget.EndDraw();
                    }
                    catch
                    {
                        CreateResources();
                    }
                });
    
                d2dFactory.Dispose();
                dwFactory.Dispose();
                renderTarget.Dispose();
            }
    
            private static void CreateResources()
            {
                if (renderTarget != null) { renderTarget.Dispose(); }
                if (defaultBrush != null) { defaultBrush.Dispose(); }
                if (greenBrush != null) { greenBrush.Dispose(); }
                if (redBrush != null) { redBrush.Dispose(); }
                if (backgroundBrush != null) { backgroundBrush.Dispose(); }
    
    
                HwndRenderTargetProperties wtp = new HwndRenderTargetProperties();
                wtp.Hwnd = mainForm.Handle;
                wtp.PixelSize = new Size2(mainForm.ClientSize.Width, mainForm.ClientSize.Height);
                wtp.PresentOptions = PresentOptions.Immediately;
                renderTarget = new WindowRenderTarget(d2dFactory, new RenderTargetProperties(), wtp);
    
                defaultBrush = new SolidColorBrush(renderTarget, Color.White);
                greenBrush = new SolidColorBrush(renderTarget, Color.Green);
                redBrush = new SolidColorBrush(renderTarget, Color.Red);
                backgroundBrush = new SolidColorBrush(renderTarget, new Color4(0.3f, 0.3f, 0.3f, 0.5f));
    
                textRenderer.AssignResources(renderTarget, defaultBrush);
    
            }
        }
    }
    

     

    展开全文
  • 四、C# winform 局部刷新 做winform界面程序时,经常会遇到后台处理占用大量时间的情况,这就会造成界面假死状态。一般解决界面假死有两种方式:要么把占用大量时间的处理方式放入其他线程;要么把界面显示放入其他...

    近期在项目中遇到了登录以及切换界面时,界面不停闪烁的问题,经过查阅发现以下方法可以成功解决该问题。

    将下面代码添加到窗体代码中即可:

    
     
    1. protected override CreateParams CreateParams //防止界面闪烁

    2. {

    3. get

    4. {

    5. CreateParams paras = base.CreateParams;

    6. paras.ExStyle |= 0x02000000;

    7. return paras;

    8. }

    9. }

    一、通过对窗体和控件使用双缓冲来减少图形闪烁(当绘制图片时出现闪烁时,使用双缓冲)

    对于大多数应用程序,.NET Framework 提供的默认双缓冲将提供最佳效果。默认情况下,标准 Windows 窗体控件是双缓冲的。可以通过两种方法对窗体和所创作的控件启用默认双缓冲。一种方法是将 DoubleBuffered 属性设置为 true,另一种方法是通过调用 SetStyle 方法将 OptimizedDoubleBuffer 标志设置为 true。两种方法都将为窗体或控件启用默认双缓冲并提供无闪烁的图形呈现。建议仅对已为其编写所有呈现代码的自定义控件调用 SetStyle 方法。

    在构造函数里加上以下代码:

    复制代码

    1 this.DoubleBuffered = true;//设置本窗体
    2 SetStyle(ControlStyles.UserPaint, true);
    3 SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.
    4 SetStyle(ControlStyles.DoubleBuffer, true); // 双缓冲
    5 //SetStyle(ControlStyles.DoubleBuffer | ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
    6 
    7 //UpdateStyles();

    复制代码

     

    二、C#控件的闪烁问题解决方法总结
    最近对代码作了一些优化,试验后效果还可以,但是发现界面会闪烁,具体是TreeView控件会闪烁,语言为C#,IDE为VS2005。在查阅一些资料,使用了一些基本技术后(如开启双缓冲),发现没什么效果。
            于是使用Profiler工具,查找出瓶颈在于每次更新完界面的EndUpdate操作(使用这个是为了减少界面更新次数,但这里不理想是因为控件中中的元素很多),猜想大概每次更新,.Net底层都会更新重绘每个图元,所以速度会慢,造成闪烁。但是如果这样,使用双缓冲应该会有较好效果。再看代码,发现可能是更新动作太过频繁,于是降低速度,有所好转,但还是不行。
           继续在网上查阅,最终找到一个方案比较合适。原来底层重绘每次会清除画布,然后再全部重新绘制,这才是导致闪烁最主要的原因。于是重载消息发送函数操作,禁掉这条消息。代码如下:

    1 protected override void WndProc(ref Message m)
    2 {
    3     if (m.Msg == 0x0014) // 禁掉清除背景消息
    4         return;
    5     base.WndProc(ref m);
    6 }    

    成功!

     

    注:双缓冲还是有用的,在更新不是很频繁且控件内含元素不是特别多的时候。一旦元素过多,每次更新时间都比较长,即便使用了双缓冲,仍解决不了闪烁问题。个人认为最终比较理想的方法还是禁掉清除背景消息。


    附:一些尝试过但失败的记录
    1)使用setStyle
          网上有说使用setStyle函数去设置该控件的参数,具体为:
          SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
          这三个选项参数后者是依赖前者的,必须并存,否则无效。并且这个函数本身是protected的,所以首先需要继承某控件再使用。
          这个目标是跟前面正确解决方案一致,也是禁止清除背景并开启双缓冲,但需要使用用户绘制选项,而且是全部交由用户绘制。这需要自己实现控件的全部绘制,比较麻烦。所以这个方法不是完全不可行,但是需要额外工作量,不推荐。我也没有使用。


    2)使用BeginUpdate和EndUpdate
          这一对操作对于需要批量操作更新控件的情景有比较好的效果,比如初始化时批量添加了大量节点。坏处就在于不能即时更新。所以,对于频繁的更新节点并希望立即反映到界面的情况不适用。如果使用并且没有禁掉清除界面消息的话,则控件看起来就会不停的闪烁,而且以白底为主,内容几乎不可见(这个视频繁程度而定)。因为界面更新都在EndUpdate处完成,操作太多导致EndUpdate阻塞时间过长,且清空在先,更新在后,导致界面看起来长时间处于空白状态。


    3)使用ControlStyles.EnableNotifyMessage选项
          这个选项的作用和正确解决方案也是一致的。使用方法是:
          SetStyle(ControlStyles.EnableNotifyMessage, true);
          protected override void onNotifyMessage(Message m)
          {
                   // 此处书写过滤消息代码
          }
          但是实际实验显示无效果,不知是什么原因,没有细究。

     

    三、个人在一个winfrom中测试利用timer控件对要刷新的控件进行定时刷新,可能也能起到作用。

     

    四、C# winform 局部刷新
    做winform界面程序时,经常会遇到后台处理占用大量时间的情况,这就会造成界面假死状态。一般解决界面假死有两种方式:要么把占用大量时间的处理方式放入其他线程;要么把界面显示放入其他线程。第一种方式应该比较简单,开单独的线程,处理数据,将处理数据显示到界面就好。但是我们经常需要在主程序运算一些内容,否则可能会改动比较大。因此,这里讲讲第二种方式。
    同样是使用多线程,但是c#在其他线程刷新有一点点问题,即不能跨线程操作界面。这可以使用控件的Invoke方法解决:

    复制代码

    1 private delegate void CrossThread();
    2 Control control = ....;
    3 CrossThread cross = delegate()
    4 {
    5      control.Refresh();
    6 };
    7 control.Invoke(cross);

    复制代码

    这样可以让控件在其它线程刷新界面。


    再加上开新线程后的通用方法:

    复制代码

     1 private void InvaliateControl(Control control)
     2 {
     3     Thread t = new Thread(
     4         new ThreadStart(delegate()
     5         {
     6             CrossThread cross = delegate()
     7             {
     8                 control.Refresh();
     9             };
    10             control.Invoke(cross);
    11         }
    12     ));
    13 }        

    复制代码

    这样就可以在任何时候,调用此方法对控件进行刷新,而不将整个界面刷新。如果对于同一个控件,连续多次刷新,可以添加一个成员变量作为标记,以免同一控件连续多次刷新,提升部分性能。


    补充:在主线程调用耗时操作用此方法可能会有问题,经过验证调用Invoke函数,其实是在主线程刷新界面。

    展开全文
  • 之前开发一个winform程序,其中有一个全屏的透明\鼠标穿透窗口(用于显示某些特定信息),在个人电脑上用的相安无事, 最近公司要把程序应用到远程桌面服务器上(局域网 Server2008),远程连接过来的人也可以使用这个程序....
  • 有时我们在绑定显示 Datagridview数据时明显感觉到卡顿. 解决方法1: 设置缓冲 在窗体的构造函数写下如下代码: public Form1() { //设置窗体的双缓冲 this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ...
  • 项目是这样设计的,一个BaseForm的基类保存全局静态对象(不知道这个有没有影响)。 子窗体使用MDI的方式显示,会使用到Panel容器和DataGridView做列表。...之前一直做web,WinForm不大会,这个如何解决呢?
  • 刚刚学完C#winform就自己做一个坦克大战,但是现在当做到后面,随着需要处理的对象信息越来越多,绘画的对象越来越多,程序变得特别卡顿,甚至停止运作……各位大神怎么解决啊
  • Winform窗体控件图片过多后卡顿问题

    千次阅读 2018-01-31 13:58:01
    近期做抽奖软件,作出后发现加载图片和不加载图片,程序刷新的很慢,且卡顿的很严重;严重影响用户体验; 经过网络大量资料查询,尝试了一下方法: 方法一:预加载图片方法 在窗体加载后,将图片读进来,然后释放...
  • protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.ExStyle |= 0x02000000; // 用双缓冲绘制窗口的所有子控件 return cp; } }
  • 前言多线程刷新界面主要用到多线程,委托,线程安全、事件等一系列高难度的C#操作。1、使用timer控件对要刷新的控件进行定时刷新对刷新频率要求不高的时候,可以使用该方法。2、刷新UI控件在开发软件时经常会需要...
  • 如题所述,在释放浏览器时,会卡顿好几秒,有没有大神可以指导下
  • 一开始取值并显示数据的时候,还算流畅,但是当过了三四十秒后,四条曲线上面的点多了,显示的时候就开始卡顿了,有什么办法能够让这个实时曲线图跟数据采集频率一致,并且不卡顿界面的办法? ![图片说明]...
  • 最近某个WinForm项目中,一个窗体中放了不少按钮,都用图片作为背景,启动时发现卡顿无比,不断闪烁很长时间界面才能加载完成。 尝试拿掉图片后,就不卡了。但各种背景图片又是必须的,怎么办? 现象是界面上...
  • 窗体的构造函数中,开启窗体的双缓冲 public ssss() { //设置窗体的双缓冲 this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.AllPaintingInWmPaint, true);...
  • UI卡顿假死问题 误区1:使用不同的线程操作UI控件和耗时操作(即,跨线程操作UI控件CheckForIllegalCrossThreadCalls=false;), 注意:此处只是为了记录...... 原始同步操作如下所示: private void button1_...
  • 前言多线程刷新界面主要用到多线程,委托,线程安全、事件等一系列高难度的C#操作。1、使用timer控件对要刷新的控件进行定时刷新对刷新频率要求不高的时候,可以使用该方法。2、刷新UI控件在开发软件时经常会需要...
  • 目前将这些状态写在winform自带的定时器里面监控,但是运行时界面的其他控件使用起来反应迟钝 问题: 1.label控件的Backgroudcolor属性可以在线程中更改吗? 2.已经试过委托和线程的方法,但是调用的label控件...
  • protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.ExStyle |= 0x02000000; // 用双缓冲绘制窗口的所有子控件 return cp;...
  • protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.ExStyle |= 0x02000000; // 用双缓冲绘制窗口的所有子控件 return cp; ...将此方法放在需要优化的窗体代码中...
  • 但是在窗体加载时,每次自定义控件都会先变成透明,卡顿一下后才会显示出来 设计器里的效果: 卡顿后的效果: 解决办法: 在使用自定义控件的窗体代码中重写下面的方法: protected override ...
  • 前言 多线程刷新界面主要用到多线程,委托,线程安全、事件等一系列高难度的C#操作。 1、使用timer控件对要刷新的控件进行定时刷新 对刷新频率要求不高的时候,可以使用该方法。 2、刷新UI控件 ...
  • using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Data.SqlClient;using System.Drawing;using System.Linq;using System.Net;using System.Net.Sockets...
  • 如何解决 C#WinForm项目中使用控件较多时出现刷新问题[img=https://img-bbs.csdn.net/upload/202001/21/1579583933_740892.jpg][/img][img=https://img-bbs.csdn.net/upload/202001/21/1579583944_470704.jpg][/img]...
  • using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.Linq;...using System.Net
  • 当点击一个菜单项,完成加载比较大量的数据的函数,菜单点击后,它不马上收起,好像卡顿在那里,等大量数据加载...菜单就是winform的menumain,找了半天也没有找到方法,refresh也不行。请高手不吝指教。 谢谢了。

空空如也

空空如也

1 2 3 4 5
收藏数 88
精华内容 35
关键字:

winform卡顿