| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1814 人关注过本帖
标题:[求助]线程间操作无效?
只看楼主 加入收藏
jockey
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:977
专家分:52
注 册:2005-12-4
结帖率:33.33%
收藏
 问题点数:0 回复次数:9 
[求助]线程间操作无效?

这是什么意思?
我在Form里有一个LIstBox
然后,
我开了一个线程(Listen())用来监听端口
线程Listen() 里面已经成功连接后需要向ListBox写入东西,则出现下面的错误:

图片附件: 游客没有浏览图片的权限,请 登录注册


[此贴子已经被作者于2007-1-25 13:34:29编辑过]

搜索更多相关主题的帖子: 线程 
2007-01-25 13:34
jockey
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:977
专家分:52
注 册:2005-12-4
收藏
得分:0 
也就是说ListBox是原来线程创建的,则新的线程是不能访问它的。

那么该如何访问这个控件啊?(新线程是不断监听端口,连接成功后必须要访问ListBox啊!)

2007-01-25 13:39
CrazyWeed0907
Rank: 2
等 级:新手上路
威 望:5
帖 子:1385
专家分:0
注 册:2006-5-30
收藏
得分:0 
delegate

“十步杀一人,千里不留行。事了拂衣去,深藏身与名。”
2007-01-25 15:35
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 

在线程里调用那个控件的Invoke函数调用要做的函数,没记错的话

2007-01-25 17:06
swc
Rank: 3Rank: 3
等 级:论坛游民
威 望:6
帖 子:394
专家分:83
注 册:2006-4-7
收藏
得分:0 
cross-threading 错误.
msdn里面有详解啊.有三四个解决方法的.
最简单的是让程序不检查这个错误.

实践、学习、再实践、再学习......
2007-01-25 20:40
sdpdww
Rank: 1
等 级:新手上路
帖 子:352
专家分:0
注 册:2006-5-11
收藏
得分:0 

你在所有过程的外面声明一个新的线程对象,不要再任何一个过程的里面声明


当天使松开我手的那一刹那,我永远的堕落了D.@ngel
2007-01-27 08:33
jockey
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:977
专家分:52
注 册:2005-12-4
收藏
得分:0 

哦,也就是说对 ListBox1的调用必须检查它的InvokeRequired是否为True,如果为True的话就得更改Invoke?

delegate void SetTextCallback(string text);

private void SetText(string text)
{
if (this.listBox1.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text });
}
else
{
this.listBox1.Items.Add(text);
}
}


好像不很方便啊!
SWC:怎么关闭检查?怎么设置?不会弄
public static bool CheckForIllegalCrossThreadCalls { get; set; }


2007-01-27 12:55
jockey
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:977
专家分:52
注 册:2005-12-4
收藏
得分:0 
呵呵,知道了
Control.CheckForIllegalCrossThreadCalls = false;

2007-01-27 13:05
swc
Rank: 3Rank: 3
等 级:论坛游民
威 望:6
帖 子:394
专家分:83
注 册:2006-4-7
收藏
得分:0 
以下是引用sdpdww在2007-1-27 8:33:00的发言:

你在所有过程的外面声明一个新的线程对象,不要再任何一个过程的里面声明

这个错误应该是由于实例化的线程与调用的线程不同才导致的吧?跟在哪声明有关系吗?
如果可行,能不能举个例子?

to jockey:
1、关闭检查是不安全的做法,虽然简单.在label的附值不会出现什么问题,但如果是其他关键对象出现这样的错误容易使程序崩溃(有点危言耸听),至少会导致检查不出错误。
2、嫌麻烦可以优化一下方法。
如将托管改为delegate void SetTextCallback(string text,Label l);这样就不用对每个label设置托管了。
如果能把第二个参数改为oject类型就更方便了,适用于除label之外的一些对象。不过还未实验过,不知道是否可行。


实践、学习、再实践、再学习......
2007-01-27 18:27
jockey
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:977
专家分:52
注 册:2005-12-4
收藏
得分:0 
多谢了!

2007-01-28 09:18
快速回复:[求助]线程间操作无效?
数据加载中...
 
   



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

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