标题:关于窗体与多线程的问题
只看楼主
asjiazhen
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2010-8-25
结帖率:62.5%
已结贴  问题点数:10 回复次数:8 
关于窗体与多线程的问题
在窗体中添加两个Lable控件和一个Button控件。单击Button控件在两个Lable控件中显示计算结果。代码是:
using System;
using System.Collections.Generic;
using
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace LXK
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        Thread th1, th2;
        double x1, x2;

        private void button1_Click(object sender, EventArgs e)
        {
            th1 = new Thread(new ThreadStart(fangfa1));
            th2 = new Thread(new ThreadStart(fangfa2));
            th1.Start();
            th2.Start();
        }

        private void fangfa1()
        {
            for (int i = 0; i < 50; i++)
            {
                x1 = i * 2;
                label1.Text += x1.ToString();
            }
        }

        private void fangfa2()
        {
            for (int i = 0; i < 50; i++)
            {
                x2 = i + 2;
                label2.Text += x2.ToString();
            }
        }

        private void Form3_Load(object sender, EventArgs e)
        {
            button1.Text = "OK";
            label1.BorderStyle = BorderStyle.Fixed3D;
            label2.BorderStyle = BorderStyle.FixedSingle;
        }
    }
}
运行提示错误,请帮忙解决下。谢谢。
搜索更多相关主题的帖子: double 计算 public 多线程 
2012-05-20 21:56
xydddaxia
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:33
帖 子:466
专家分:2307
注 册:2009-3-20
得分:0 
跨线程调用控件肯定要调用委托,很基础的问题了

站在春哥的肩膀上
2012-05-21 12:24
lhb62232397
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:1
帖 子:117
专家分:546
注 册:2011-11-6
得分:0 
Form3_load,哪来的?
具体错误是什么,贴出来
2012-05-21 13:21
lhb62232397
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:1
帖 子:117
专家分:546
注 册:2011-11-6
得分:0 
刚才又上网搜了下,发现你的问题确实是2楼所说:
挂线程调用控件必须要用委托
2012-05-21 14:34
asjiazhen
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2010-8-25
得分:0 
回复 3楼 lhb62232397
那个没有改过来。是在From3中写的,在From1中调用的。调用那部分没写,把它改了下,没改彻底。很抱歉。
2012-05-21 20:09
asjiazhen
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2010-8-25
得分:0 
回复 2楼 xydddaxia
该如何调用委托?
2012-05-21 20:11
zwffff
Rank: 4
等 级:业余侠客
威 望:1
帖 子:58
专家分:224
注 册:2007-11-13
得分:3 
public delegate void SetControl();

将代码
private void fangfa1()
        {
            for (int i = 0; i < 50; i++)
            {
                x1 = i * 2;
                label1.Text += x1.ToString();
            }
        }
改成
private void fangfa1()
        {
            if(label1.InvokeRequired)
            {
                label1.BeginInvoke(new SetControl(fangfa1));
                return;
            }

            for (int i = 0; i < 50; i++)
            {
                x1 = i * 2;
                label1.Text += x1.ToString();
            }
        }
方法fangfa2类似的改一下

欢迎加入.Net技术交流群:90925122
2012-05-21 22:42
xydddaxia
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:33
帖 子:466
专家分:2307
注 册:2009-3-20
得分:3 
如果为了图省事,可以在实例化Form1的时候设置忽略跨线程调用UI的错误
Form1.CheckForIllegalCrossThreadCalls = false;
不过这就没线程安全了

站在春哥的肩膀上
2012-05-22 08:49
lhb62232397
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:1
帖 子:117
专家分:546
注 册:2011-11-6
得分:3 
       Thread th1, th2;
        double x1, x2;

        public delegate void SetControl();
        private void button1_Click(object sender, EventArgs e)
        {
            th1 = new Thread(new ThreadStart(ffa1));
            th2 = new Thread(new ThreadStart(ffa2));
            th1.Start();
            th2.Start();

        }

        public void ffa1()
        {
            if (label1.InvokeRequired)
            {
                SetControl sc = new SetControl(fangfa1);
                this.BeginInvoke(sc, new object[] { });
            }
        }
        public void ffa2()
        {
            if (label2.InvokeRequired)
            {
                SetControl sc = new SetControl(fangfa2);
                this.BeginInvoke(sc, new object[] { });
            }
        }

和7楼的基本原理都是一样的,使用委托。
但是没有修改你的两个方法
2012-05-22 09:32



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-367790-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.085828 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved