标题:请问新建线程为何不能访问主窗口控件
只看楼主
wuyanmin
Rank: 1
等 级:新手上路
帖 子:10
专家分:1
注 册:2010-5-29
结帖率:50%
已结贴  问题点数:10 回复次数:13 
请问新建线程为何不能访问主窗口控件
想在新开线程中访问主窗口的控件,比如在文本框中写入当前线程工作的状态,但是VS2008提示不可,帮助信息实在太多了,没有看懂,请指教!

下面是书上的例程:

 private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                myIP = IPAddress.Parse(textBox1.Text);
            }
            catch
            {
                MessageBox.Show("IP地址格式错误,请重新输入!");
            }

            try
            {
                Thread thread = new Thread(new ThreadStart(accp));
                thread.Start();
                //accp();
            }
            catch (Exception ee)
            {
                textBox3.AppendText(ee.Message);
            }
        }

        private void accp()
        {
            myServer = new IPEndPoint(myIP, Int32.Parse(textBox2.Text));
            sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            sock.Bind(myServer);
            sock.Listen(50);
            textBox3.AppendText("主机" + textBox1.Text + "端口" + textBox2.Text + "开始监听... ... \r\n"); //就是这句有问题啊!
            accSock = sock.Accept();
            if (accSock.Connected)
            {
                textBox3.AppendText("与客户建立联系");
                while (check)
                {
                    Byte[] Rec = new Byte[64];
                    NetworkStream netStream = new NetworkStream(accSock);
                    netStream.Read(Rec, 0, Rec.Length);
                    string RecMessage = System.Text.Encoding.BigEndianUnicode.GetString(Rec);
                    richTextBox1.AppendText(RecMessage + "\r\n");
                }
            }
        }

居然不能执行,晕死啊!
搜索更多相关主题的帖子: IP地址 文本框 
2011-04-16 15:43
zxl3266298
Rank: 1
等 级:新手上路
帖 子:1
专家分:2
注 册:2011-4-16
得分:2 
主窗体应该由主线程执行,你所开的新线程要访问的应该是你实例化出来的方法,
2011-04-16 17:28
athenalux
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河北石家庄
等 级:小飞侠
威 望:8
帖 子:975
专家分:2514
注 册:2008-11-26
得分:2 
是线程安全导致的,微软不允许其它线程直接访问创建介面的线程的控件。

QQ:81704464
2011-04-16 17:51
wuyanmin
Rank: 1
等 级:新手上路
帖 子:10
专家分:1
注 册:2010-5-29
得分:0 
那该怎么办呢?这个是书上的原代码啊!很郁闷……
2011-04-16 20:15
athenalux
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河北石家庄
等 级:小飞侠
威 望:8
帖 子:975
专家分:2514
注 册:2008-11-26
得分:0 
自己看
https://bbs.bccn.net/viewthread.php?tid=293364&highlight=%B6%E0%CF%DF%B3%CC

[ 本帖最后由 athenalux 于 2011-4-17 06:28 编辑 ]

QQ:81704464
2011-04-17 06:27
zhp223
Rank: 5Rank: 5
等 级:职业侠客
帖 子:99
专家分:362
注 册:2010-3-21
得分:2 
要用Invoke方法
...
Action del = () => {
    textBox3.AppendText("主机" + textBox1.Text + "端口" + textBox2.Text + "开始监听... ... \r\n");
};
textBox3.Invoke(del);
...

日有所思,夜有所梦
2011-04-17 19:15
qubo1982
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:367
专家分:1132
注 册:2009-3-18
得分:2 
加一条语句就可以
Form.CheckForIllegalCrossThreadCalls = false;
不捕获对错误线程的调用
2011-04-18 14:27
zhp223
Rank: 5Rank: 5
等 级:职业侠客
帖 子:99
专家分:362
注 册:2010-3-21
得分:0 
以下是引用qubo1982在2011-4-18 14:27:17的发言:

加一条语句就可以
Form.CheckForIllegalCrossThreadCalls = false;
不捕获对错误线程的调用

报错的话,那段代码就执行不了了呀,那还写那代码干嘛

日有所思,夜有所梦
2011-04-18 19:44
qubo1982
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:367
专家分:1132
注 册:2009-3-18
得分:0 
回8楼
不是要报错,是不对“错误的线程”报错,说起来有点绕,建议你亲自试一下
2011-04-18 21:35
wuyanmin
Rank: 1
等 级:新手上路
帖 子:10
专家分:1
注 册:2010-5-29
得分:0 
这条语句加在何处呢?提供例程的书是2002年出版的,那个时候可以执行上述代码而没有限制么?
2011-04-18 23:02



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




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

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