多线程、委托、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 ...
随机推荐
- wget 断点续传 & nginx文件服务器
nginx默认支持断点续传: 测试方法: wget -S http://httpd.apache.org/images/httpd_logo_wide_new.png 2>&1 | gr ...
- liniux mint android-ndk风波
我的安装过程sudo chmod a+x android-ndk-r10d-linux-x86_64.bin/dowonload $ ./android-ndk-r10d-linux-x86_64.b ...
- FWT与High dick(划掉改成Dimensional) Fourier Transform
我们大家都知道xor卷积有个很好的做法:FWT.FWT的变换形式是很好看的 // 说明一下Vector可以向量化运算,也可以当做数组来slice与concat Vector tf(A,2^n){ Ve ...
- CF576E
*在#里发他一直WA这道CF题,然后我就去看了看,感觉还挺有趣的,那我就在这里整理一下我的思路..毕竟一边听歌.. 题意: 给个图,每条边初始无色,每次给一个询问(e,c)表示把e涂成颜色c,如果此时 ...
- PHP基础
$a=10; //$b="hello";//$a=(string)$a; 强制转换A的类型为字符串 //settype($a,"string");//var_d ...
- connect-flash 中间件
http://blog.csdn.net/liangklfang/article/details/51086607
- 多预览小图焦点轮播插件lrtk
多预览小图焦点轮播插件lrtk // JavaScript Document $(document).ready(function(){ //$('#select_btn li:first').css ...
- 3.1 AngularJS必备知识
AngularJS是一个WEB应用框架. 本节我们会学习控制器(控制数据),会学习作用域(连接控制器和用户界面),用户界面又叫做视图,通过模板和作用域来创建交互视觉效果.另外,我们还会学习其他的特性比 ...
- iOS新手引导页的实现,源码。
/*.在Main.storyboard中找到,ScrollView和PageControl并添加到ViewController中. .在ScrollView中添加ImageView,新手引导页有几个图 ...
- python之路:Day01 --- Python基础1
本节内容 1.Python介绍 2.发展史 3.变量 4.用户输入 5.表达式 if...else语句 6.表达式 for 循环 7.表达式 while 循环 8.模块初识 9.数据类型初识 10.数 ...