
默认情况下,在调试多线程程序时,当遇到断点时(breakpoint),当前线首塌程暂停,而其它线程继续运行侍芹散,有些情况下,这是我们不想要看到的。比如下面的例子:
除第21个线程以外,其余都是Running状态。
修改:
Window->Preferences->Java->Debug:
在红老氏色区域内,将默认的Suspend Thread 改为 Suspend VM
再调试多线程程序:
可以看到所有线程都Suspend了。
是这样子的呀,因为listBox1是Form1这个线程创建的,当然不能让其他的线程访问了。如果需要被其他的线程访问的化,需要使用委托。举个例子:
//
先定义一个委托
public
delegate
void
SetTextCallback(string
text)
//
单击按悉搭钮
private
void
button1_Click(object
sender,
EventArgs
e)
{
Thread
t
=
new
Thread(new
ThreadStart(fun1))
t.Start()
}
//
线程函数体
private
void
fun1()
{
setText("hello")
}
//
设置文本函数
private
void
setText(string
text)
{
if
(label1.InvokeRequired)
{
SetTextCallback
s
=
new
SetTextCallback(setText)
Invoke(s,
new
string[]
{
text
})
}
else
{
label1.Text
=
text
}
}
窗体其实是窗体类的一个实例,当类实例了一个对象后,就相当与创建了一个线程,所以不能直接用其他的线程访问内部成员。
连分都没有还要求改代码,太过分了,你要嫌麻烦,就在构造函数里面加一句:
public
Form1()
{
InitializeComponent()
CheckForIllegalCrossThreadCalls
=
false
}
MSDN对CheckForIllegalCrossThreadCalls的解释:获取或设置一个值,该值指示是否捕获对错误线程的调用,这些调用在调试应用程序时访问控件的
Handle
属性。
如果试图访问控件的方法或属性之一的线程不是创建该控件的线程,则通常会导致不可预知的睁郑拿结果。通常,无效的线程活动是对访问控件的
Handle
属性的错误线程的调用。将
CheckForIllegalCrossThreadCalls
设置为
true
可以在调试时更容易查找并诊断此线程活动。请注意在调试器外部启动应用程序时,非法跨线程调用将始终引发异常。丛知
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)