您的位置:首页 > 其它

在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类可以达到这样的功能

不过那个是控件

还是喜欢对底层的一些东西来操作 所以没有理会
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐