多线程、委托、Invoke解决winform界面卡死的问题,并带开关

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading; namespace WindowsFormsApplication3
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
} /// <summary>
/// 因为控件的Invoke方法需要接收委托变量,因此需要定义委托和委托变量
/// 定义一个委托,接收一个参数
/// </summary>
/// <param name="msg"></param>
public delegate void DelegateFun(string msg);
/// <summary>
/// 定义一个委托变量
/// 这个委托变量,需要初始化指定具体的方法;然后传递给控件的Invoke方法调用。
/// </summary>
public DelegateFun Fun1; /// <summary>
/// 定义一个线程,处理数据,并更新界面
/// </summary>
private Thread t = null;
// 开始按钮
private void button1_Click(object sender, EventArgs e)
{
this.Invoke(Fun1, "开始..."); // 增加判断,避免每次单击都开辟一个线程
if (t == null)
{
t = new Thread(Run);
t.Start();
}
if (t.ThreadState == ThreadState.Suspended) // 如果被挂起了,就唤醒
{
t.Resume();
} }
// 结束执行
private void button2_Click(object sender, EventArgs e)
{
t.Suspend(); // 停止,挂起线程
this.Invoke(Fun1, "...停止");
} // 具体做事情的方法
public void Run()
{
//...... 处理一些事情,然后输出日志
int i = ;
while (true)
{
i++;
// this指Form2
//Invoke指: 在拥有控件的基础窗口句柄的线程上,用指定的参数列表执行指定委托。
//Invoke的参数是一个委托类型,因此必须定义委托变量
this.Invoke(Fun1, i.ToString());
}
} //在form初始化的时候,给委托变量赋值具体的方法
private void Form2_Load(object sender, EventArgs e)
{
//给委托变量初始化具体的执行方法
Fun1 = Print;
} // 输出日志的方法
public void Print(string msg)
{
// 新开辟的线程,不能直接调用这个方法。原因是控件只能由创建它的线程调用。
// 其他线程调用提示错误: 线程间操作无效: 从不是创建控件“richTextBox1”的线程访问它。
this.richTextBox1.AppendText(msg + "\r\n");
this.richTextBox1.ScrollToCaret();
} }
}
多线程、委托、Invoke解决winform界面卡死的问题,并带开关的更多相关文章
- 双缓冲队列解决WPF界面卡死
工作中的项目,CS客户端会通过MQ接收前端设备发送的信息,之前测试的时候,由于测试的数据不大,没有进行压力测试,软件可以正常工作,随着项目现场设备数量的增加,CS客户端从MQ中订阅的数据量不断增加,最 ...
- 使用multiprocessing解决PyMuPDF不支持多线程加载导致的界面卡死无响应问题,及一个PyQt5实现的简易PDF阅读器例子
最近在用PyMuPDF实现一个PDF阅读器,发现PyMuPDF在加载某些epub时耗时非常长,有的长达10几秒,会导致界面卡死无响应. 尝试用多线程后台加载,发现还是不能解决问题,和作者交流(issu ...
- Centos7解决图形界面卡死问题
经常会遇到图形界面卡死,搜了一搜,解决办法如下: killall -9 gnome-shell
- 【C#】多线程解决UI界面卡死的问题
一个经典的例子: http://www.cnblogs.com/wangchuang/p/4485797.html 问题: 都说Invoke是同步的,BeginInvoke是异步的,但为何用Begin ...
- 解决 winform 界面对不齐 z
一个winform的程序,本机上界面对得很齐,到一到客户的机器上就惨不忍睹,一番研究后搞定: 1. AutoScaleMode = None 2. BackgroundImageLayout = No ...
- 解决 winform 界面对不齐
最近做了一个winform的程序,本机上界面对得很齐,到一到客户的机器上就惨不忍睹,一番研究后搞定: 1. AutoScaleMode = None 2. BackgroundImageLayout ...
- 解决WinForm界面闪烁问题
前言 之前將.net 1.1 Windows Form程式升級到.net 4.0,結果在開畫面時,閃的非常利害! 於是就開始找解決方法. 研究及解決 開始找到了設定DoubleBuffer=true ...
- C#多线程解决界面卡死问题的完美解决方案,BeginInvoke而不是委托delegate 转载
问题描述:当我们的界面需要在程序运行中不断更新数据时,当一个textbox的数据需要变化时,为了让程序执行中不出现界面卡死的现像,最好的方法就是多线程来解决一个主线程来创建界面,使用一个子线程来执行程 ...
- WinForm多线程+委托防止界面卡死
1.当有大量数据需要计算.显示在界面或者调用sleep函数时,容易导致界面卡死,可以采用多线程加委托的方法解决 using System; using System.Collections.Gener ...
随机推荐
- 分布式之ZookeeperMac安装
Zookeeper用于分布式计算中的协调员,观察员,观察者,分布式锁,在系统中利用Zookeeper来处理事件通知,队列,锁等功能. 使用brew安装 zookeeper. 可参考:http://bl ...
- Vue.js 快速入门
什么是Vue.js vue是法语中视图的意思,Vue.js是一个轻巧.高性能.可组件化的MVVM库,同时拥有非常容易上手的API.作者是尤雨溪,写下这篇文章时vue.js版本为1.0.7 准备 我推荐 ...
- 怎样用conda安装opencv
首先用Anaconda是因为方便(管理方便,包安装真心不方便).下面是我的安装过程: 首先使用如下命令安装opencv conda install -c https://conda.binstar.o ...
- 如何把Qlik Sense嵌入到Web应用中
(此文章同时发表在本人微信公众号"dotNET开发经验谈",欢迎右边二维码来关注.) 题记:这是一个给初学者(尤其对VS不熟悉的BI工程师)的入门操作向导. Qlik Sense是 ...
- C语言语法 typedef小结
在总结typedef之前,先了解一个专业术语: 常量指针(const pointer):常量指针在定义的时候必须被初始化,而且一旦初始化完成,则它的值就不能再改变. int errNumb = 0; ...
- Oracle 11g RAC 环境打PSU补丁的详细步骤
首先重要的事情说三遍:操作之前还是自己先看文档!操作之前还是自己先看文档!!操作之前还是自己先看文档!!! 把11.2.0.4 RAC 环境打PSU补丁的步骤详细记录一下,方便参考. 环境:11.2. ...
- UWP Composition API - 锁定列的FlexGrid
需求是第一列锁定,那么怎么让锁定列不跟着滚动条向做移动呢? 其实很简单,让锁定列跟scrollviewer的滚动做反方向移动. 先看一下这个控件的模板,嗯,其实很简单,就是ListView的模板,不同 ...
- Makefile笔记之二------make的递归执行
1.make的递归过程指的是: 在Makefile中使用"make"作为一个命令来执行本身或者其它makefile文件的过程. 2.递归的意义: 当前目录下存在一个"su ...
- 1.Linux常用命令
命令名称:ls 格式: ls [-选项] [参数] 注:中括号表示可选 命令路径:/bin/ls 功能描述:显示信息 例如: 选项 -a 显示所有的文件,包括隐藏文件,(以 . 开头的文件) -l ...
- C++-Qt【4】-CheckBox on QListView
引用:http://www.qtcentre.org/threads/47119-checkbox-on-QListView QListWidgetItem *item = new QListWidg ...