【问题标题】:how to avoid flickering winforms c#如何避免闪烁的winforms c#
【发布时间】:2020-09-07 18:44:40
【问题描述】:

我编写了一个发送 ICMP 请求的简单程序。该程序在自己的线程中轮询每个主机。问题是表单上的表格闪烁,带有显示结果的标签和按钮。我尝试在 Form 中设置 Doublebuffered,但没有帮助。

private void pingThreadmain(object number_thread) {            
    Ping pingSender = new Ping();            
    // поток работает, пока установлена глобальная переменная
    while (thread_ping) {                
        // замеряем время запуска пинга
        int start_ping = Environment.TickCount & Int32.MaxValue;
        // получаем таймаут из таблицы
        string timeout = "";
        Action action_timeout = () => timeout = list_timeout[(int)number_thread].Text;
        list_timeout[(int)number_thread].Invoke(action_timeout);
        // пингуем хост
        PingReply reply = pingSender.Send(list_ip[(int)number_thread].Text, Int32.Parse(timeout));
        // вычисляем время выполнения пинга
        int duration_ping = Int32.Parse(timeout) - (Environment.TickCount & Int32.MaxValue) + start_ping;
        if (reply.Status == IPStatus.Success) {
            // если хост отвечает
            // изменяем визуальные компоненты
            Action action_status = () => list_status[(int)number_thread].BackColor = Color.Green;
            list_status[(int)number_thread].Invoke(action_status);
            Action action_rtt = () => list_rtt[(int)number_thread].Text = reply.RoundtripTime.ToString();
            list_rtt[(int)number_thread].Invoke(action_rtt);
            // проверяем что таймаут паузы не отрицательный
            if (duration_ping > 0) {
                Thread.Sleep(duration_ping);
            }
        }
        else {
            // если хост не отвечает
            // изменяем визуальные компоненты 
            Action action_status = () => list_status[(int)number_thread].BackColor = Color.Red;
            list_status[(int)number_thread].Invoke(action_status);
            Action action_rtt = () => list_rtt[(int)number_thread].Text = "---";
            list_rtt[(int)number_thread].Invoke(action_rtt);
            Action action_fail = () => list_fail[(int)number_thread].Text = (Int32.Parse(list_fail[(int)number_thread].Text) + 1).ToString();
            list_fail[(int)number_thread].Invoke(action_fail);
            // выводим сообщение о недоступности хоста
            AddLog($"нет ответа от {list_ip[(int)number_thread].Text} {list_name[(int)number_thread].Text}");
            // проверяем что таймаут паузы не отрицательный
            if (duration_ping > 0) {
                Thread.Sleep(duration_ping);
            }
        }
    }
}

【问题讨论】:

  • thread_pingvolatile?如果没有,请完全丢弃您的代码。
  • 您需要为输出到的控件而不是表单启用双缓冲。

标签: c# winforms


【解决方案1】:

this.DoubleBuffered = true 行应该有效。

好像不在YourProject.YourProject类中

应该在类中才能正确实现双缓冲。

你也应该试试ControlStyles EnumControlStyles 。应该在SetStyle下实现,必须是YourProject.YourProject类型。

您可以在此处找到其他方法 - how to stop flickering C# winforms

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 2016-06-30
    • 2013-11-16
    • 1970-01-01
    相关资源
    最近更新 更多