在winform中使用多线程 并跨线程操作按钮及文本框
2008-12-27 21:51
225 查看
继续贴吧江湖的项目
在利用前面的socket Http Get 和Post 已经可以成功登陆论坛
但是在socket中读取HTML代码速度让我很难受
所以在form类中创建新的线程来操作socket 然后在窗口中放了一个滚动条 感觉满好看的 vista启动画面那种
Run()方法是调用以及操作socket的方法 就是准备在新线程中执行的方法 也就是俗称耗时的方法
在成员变量中定义线程 以及 回掉委托 :
private Thread th = null;//定义线程
delegate void SetTextCallback(string text);//定义一个包含参数的委托
delegate void f(); //定义一个用作跨线程操作窗体控件的委托
定义两个委托是 一个对文本框操作 一个对按钮操作
事件触发代码
private void button1_Click(object sender, EventArgs e)
{
progressBar1.Style = ProgressBarStyle.Marquee;
th = new Thread(new ThreadStart(Run));
th.Start();
//progressBar1.Style = ProgressBarStyle.Blocks;
}
下面几个方法是在新线程中对窗体原创线程利用委托来进行回调请求
以及原线程收到请求后做的事情
private void SetText(string text)//跨线程操作窗体 改变文本框内容
{
if (this.richTextBox1.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text });
}
else
{
this.richTextBox1.Text = text;
}
}
private void LoginButton()//请求窗体创建线程将按钮1设置为false
{
button1.Enabled = !button1.Enabled;
}
private void UiCon(f objf)//跨线程操作窗体控件,参数为定义的委托类对象
{
Invoke(objf);
}
private void ProgBar()//请求窗体创建线程将滚动条设置为Blocks
{
progressBar1.Style = ProgressBarStyle.Blocks;
}
新线程方法中对回掉请求的调用
UiCon(new f(ProgBar));
SetText(Html);
UiCon( new f(LoginButton));
SetText方法的实现过程与UiCon本质是一样的
SetText方法多了一个判断当前线程是否为窗体创建线程
UiCon只是方便我减少代码量而做了一个传递委托对象并调用的方法
大概就这些
还有更简单的那个BackGroundWorker类可以达到这样的功能
不过那个是控件
还是喜欢对底层的一些东西来操作 所以没有理会
在利用前面的socket Http Get 和Post 已经可以成功登陆论坛
但是在socket中读取HTML代码速度让我很难受
所以在form类中创建新的线程来操作socket 然后在窗口中放了一个滚动条 感觉满好看的 vista启动画面那种
Run()方法是调用以及操作socket的方法 就是准备在新线程中执行的方法 也就是俗称耗时的方法
在成员变量中定义线程 以及 回掉委托 :
private Thread th = null;//定义线程
delegate void SetTextCallback(string text);//定义一个包含参数的委托
delegate void f(); //定义一个用作跨线程操作窗体控件的委托
定义两个委托是 一个对文本框操作 一个对按钮操作
事件触发代码
private void button1_Click(object sender, EventArgs e)
{
progressBar1.Style = ProgressBarStyle.Marquee;
th = new Thread(new ThreadStart(Run));
th.Start();
//progressBar1.Style = ProgressBarStyle.Blocks;
}
下面几个方法是在新线程中对窗体原创线程利用委托来进行回调请求
以及原线程收到请求后做的事情
private void SetText(string text)//跨线程操作窗体 改变文本框内容
{
if (this.richTextBox1.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text });
}
else
{
this.richTextBox1.Text = text;
}
}
private void LoginButton()//请求窗体创建线程将按钮1设置为false
{
button1.Enabled = !button1.Enabled;
}
private void UiCon(f objf)//跨线程操作窗体控件,参数为定义的委托类对象
{
Invoke(objf);
}
private void ProgBar()//请求窗体创建线程将滚动条设置为Blocks
{
progressBar1.Style = ProgressBarStyle.Blocks;
}
新线程方法中对回掉请求的调用
UiCon(new f(ProgBar));
SetText(Html);
UiCon( new f(LoginButton));
SetText方法的实现过程与UiCon本质是一样的
SetText方法多了一个判断当前线程是否为窗体创建线程
UiCon只是方便我减少代码量而做了一个传递委托对象并调用的方法
大概就这些
还有更简单的那个BackGroundWorker类可以达到这样的功能
不过那个是控件
还是喜欢对底层的一些东西来操作 所以没有理会
相关文章推荐
- c#中使用多线程访问winform中控件的若干问题 解决线程间操作无效: 从不是创建控件的线程访问它
- 多线程对同一数据源操作时使用 线程锁 NSCondition NSLock
- !!c# 委托与多线程 -- 相比background来说,本方法针对当需要通过异步代理发起UI操作,而后线程中进行sleep操作的时使用
- Winform中多线程的控件访问引发的“线程间操作无效,从不是创建控件的线程访问它”
- WinForm解决多线程操作控件问题 线程间操作无效: 从不是创建控件的线程访问它"
- Qt 多线程与数据库操作需要注意的几点问题(QSqlDatabase对象只能在当前线程里使用)
- Winform中进行线程安全的多线程操作(主线程控件,非backgroundWorker)
- c#中跨线程调用windows窗体控件 .我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题。然而我们并不能用传统方法来做这个问题,下面我将详细的介绍。
- (转).NET 4.5中使用Task.Run和Parallel.For()实现的C# Winform多线程任务及跨线程更新UI控件综合实例
- 在使用多线程时,要注意:有些view使用子线程获得数据,但是view上的按钮却在主线程上
- winform 多线程执行操作,并跨线程操作控件
- Java Thread 多线程 操作线程
- 黄聪:C#“多线程线程间操作无效: 从不是创建控件的线程访问它。”,跨线程修改控件属性解决方案
- C# 控制台实现关闭前的操作,并使关闭按钮无法使用
- 黑马程序员之WinForm编程基础学习笔记:用户在文本框1,2中输入两个数,点击按钮,在文本框3中显示从文本框1中的数字到文本框2中的数字之间的累加和。如果1或者2为错误的数据格式,则弹出对话框提示错
- C# 多线程编程 - 使用委托创建线程
- IOS多线程系统学习之线程的操作
- (委托事件处理)关于多线程执行显示进度条的实例(转)&&线程间操作无效: 从不是创建控件“rtxtEntryNO”的线程访问它。
- gdb的follow-fork-mode使用以及多线程操作
- (转)c#(wince)中使用多线程访问winform中控件的问题