A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© _xixi_ 中级黑马   /  2014-7-9 18:29  /  1362 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 _xixi_ 于 2014-7-10 22:44 编辑

我想写个线程,实现秒表功能,可是运行出错了,提示“线程间操作无效: 从不是创建控件“txtSecond”的线程访问它。”
以下是我的代码,请大家不吝赐教
  1. namespace clock
  2. {
  3.     public partial class Form1 : Form
  4.     {
  5.         public Form1()
  6.         {
  7.             InitializeComponent();
  8.         }

  9.         private void btnRun_Click(object sender, EventArgs e)
  10.         {
  11.             Thread th = new Thread(Sencond);
  12.             th.Start();
  13.         }

  14.         private void Sencond()
  15.         {
  16.             while (true)
  17.             {
  18.                 Thread.Sleep(100);
  19.                 int s = Convert.ToInt32(txtSecond.Text);
  20.                 if (s == 59)
  21.                 {
  22.                     txtSecond.Text = "0";
  23.                 }
  24.                 else
  25.                 {
  26.                     s += 1;
  27.                     txtSecond.Text = s.ToString();
  28.                 }
  29.             }
  30.             
  31.         }
  32.     }
  33. }
复制代码



评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

12 个回复

倒序浏览
在构造方法中添加一条:        CheckForIllegalCrossThreadCalls = false;
控件不允许线程间操作 ,有两种方法解决这个问题,一种是:使用委托; 第二种是:CheckForIllegalCrossThreadCalls就是把程序给蒙蔽了,不让其 捕捉线程间错误的操作
   

点评

我也同楼主一样的问题,感谢你呀!  发表于 2014-7-13 20:46
回复 使用道具 举报
还没学。。。。。。
回复 使用道具 举报
路过,虽然不懂但是觉得表叫牛哦!
回复 使用道具 举报
追梦无悔 发表于 2014-7-9 19:55
在构造方法中添加一条:        CheckForIllegalCrossThreadCalls = false;
控件不允许线程间操作 ,有两种 ...

谢谢~CheckForIllegalCrossThreadCalls = false;  解决了我的问题
回复 使用道具 举报
_xixi_ 发表于 2014-7-10 22:43
谢谢~CheckForIllegalCrossThreadCalls = false;  解决了我的问题

:) ok  解决了就好~
回复 使用道具 举报
gwljp 初级黑马 2014-7-11 14:31:48
7#
你的是子线程调用主线程控件问题,一般都是使用委托来达到效果的
回复 使用道具 举报
_xixi_ 中级黑马 2014-7-11 22:42:10
8#
gwljp 发表于 2014-7-11 14:31
你的是子线程调用主线程控件问题,一般都是使用委托来达到效果的

谢谢你的提点
回复 使用道具 举报
有点代码还真的不知道什么意思。。好伟大的样子
回复 使用道具 举报
本帖最后由 _xixi_ 于 2014-7-14 14:24 编辑

总算把委托的方法给实现了,谢谢各位的指点!
  1. namespace clock
  2. {
  3.     delegate void GetSec();
  4.     public partial class Form1 : Form
  5.     {
  6.         GetSec getSec;
  7.         Thread th;
  8.         public Form1()
  9.         {
  10.             InitializeComponent();
  11.         }

  12.         private void btnRun_Click(object sender, EventArgs e)
  13.         {
  14.             if (th==null||!th.IsAlive)
  15.             {
  16.                 th = new Thread(new ThreadStart(SecondRun));
  17.                 th.Start();
  18.             }
  19.         }

  20.         private void GetSecond()
  21.         {
  22.             if (txtSecond.InvokeRequired == true) //判断是否跨线程访问了
  23.             {
  24.                     txtSecond.Invoke(getSec);   //执行委托,也就是回到主线程执行GetSec()方法
  25.             }
  26.             else
  27.             {  
  28.                 if (th.IsAlive)
  29.                 {
  30.                     int s = Convert.ToInt32(txtSecond.Text);
  31.                     if (s == 59)
  32.                     {
  33.                         txtSecond.Text = "0";
  34.                     }
  35.                     else
  36.                     {
  37.                         s += 1;
  38.                         txtSecond.Text = s.ToString();
  39.                     }
  40.                 }
  41.                 Thread.Sleep(10);
  42.             }
  43.             
  44.         }

  45.         private void SecondRun()
  46.         {
  47.             getSec = new GetSec(GetSecond);
  48.             while (true)
  49.             {
  50.                 getSec();
  51.             }
  52.            
  53.         }

  54.         private void Form1_FormClosing(object sender, FormClosingEventArgs e)
  55.         {
  56.             if (th.IsAlive)
  57.             {
  58.                 th.Abort();//确保关闭窗口之前,终止线程
  59.             }
  60.         }
  61.     }

  62. }
复制代码



评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

回复 使用道具 举报
_xixi_ 发表于 2014-7-12 12:57
总算把委托的方法给实现了,谢谢各位的指点!

代码挺牛叉的,借鉴一下呀,研究研究
回复 使用道具 举报
绿箭 发表于 2014-7-13 20:54
代码挺牛叉的,借鉴一下呀,研究研究

这个在sleep这里还有点问题的,时间过长的话,会有种很卡的感觉,一起学习罗~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马