黑马程序员技术交流社区

标题: 厚着脸皮问问题:线程初识之重入问题 [打印本页]

作者: lgh521911    时间: 2013-9-24 20:35
标题: 厚着脸皮问问题:线程初识之重入问题
本帖最后由 lgh521911 于 2013-9-24 22:59 编辑

刚刚开始接触线程就碰壁了,还请大家多多指教。问题如代码。
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Threading;

  10. namespace 课堂练习1
  11. {
  12.     public partial class Form1 : Form
  13.     {
  14.         public Form1()
  15.         {
  16.             InitializeComponent();
  17.         }

  18.         /// <summary>
  19.         /// 单线程的缺点
  20.         /// 验证单线程在运行时的状态
  21.         /// </summary>
  22.         /// <param name="sender"></param>
  23.         /// <param name="e"></param>
  24.         private void button1_Click(object sender, EventArgs e)
  25.         {

  26.             count();

  27.         }
  28.         /// <summary>
  29.         /// 循环计数的方法(创建一个count类来接收数据)
  30.         /// </summary>
  31.         void count()
  32.         {
  33.             DateTime beginTime = DateTime.Now;
  34.             for (double i = 0; i <999999999; i++)
  35.             {
  36.             }
  37.             TimeSpan ts = beginTime.Subtract(DateTime.Now);  
  38.             MessageBox.Show("循环完毕"+ts.TotalMilliseconds);
  39.         }
  40.         /// <summary>
  41.         /// 使用多线程来解决 UI卡死
  42.         /// </summary>
  43.         /// <param name="sender"></param>
  44.         /// <param name="e"></param>
  45.         private void btnnum2_Click(object sender, EventArgs e)
  46.         {
  47.             //创建线程对象 传入要线程执行的方法;
  48.             Thread threadFirst = new Thread(count);
  49.             //将线程设置为后台线程(当所有的前台线程结束后,后台线程会自动退出)
  50.             threadFirst.IsBackground = true;
  51.             //启动线程  执行方法
  52.             threadFirst.Start();
  53.         }
  54.         /// <summary>
  55.         /// 修改文本框中的内容
  56.         /// </summary>
  57.         void changeTxt()
  58.         {
  59.             for (int i = 0; i < 1000; i++)
  60.             {
  61.                 int a = int.Parse(txtNum.Text);     //边看边练,我的输入都没错误,为什么到这里和视频教学里的错误不一样?(附图)
  62.                 a++;
  63.                 txtNum.Text = a.ToString();
  64.             }
  65.         }

  66.         private void txtnum_TextChanged(object sender, EventArgs e)
  67.         {

  68.         }

  69.         private void btnproblem_Click(object sender, EventArgs e)
  70.         {
  71.             Thread threadProblem = new Thread(changeTxt);
  72.             threadProblem.IsBackground = true;
  73.             threadProblem.Start();

  74.         }
  75.     }
  76. }
复制代码
为什么与教学视频中弹出的问题不一样?[qq]108837521[/qq]

问题1.jpg (45.75 KB, 下载次数: 44)

问题1.jpg

作者: 七里香    时间: 2013-9-24 20:46
看不到图额,太小了{:soso_e127:}
作者: lgh521911    时间: 2013-9-24 21:19
七里香 发表于 2013-9-24 20:46
看不到图额,太小了

就是在视频中程序调试提示“线程间操作无效,从不是创建控件"txtNum"的线程访问它。而我在边看视频边做的时候显示的错误时报错为:输入字符串格式不正确?我也和对了很长时间外加重新输入都显示这个

作者: Always.    时间: 2013-9-24 22:53
  我想应该是这样的: 我们执行代码的线程(文本框是有UI线程创建的)不是我创建空间的线程。
你的:public Form1()
        {
            InitializeComponent();
        }
应该改为
public Form1()
        {
            InitializeComponent();
            TextBox.CheckForIllegalCrossThreadCalls = false;  //关闭控件之间的线程检查
        }
TextBox.CheckForIllegalCrossThreadCalls = false;  这行代码是微软提供给我关闭控件之间的线程检查的。
希望能帮到你!你试试看,可不可以


作者: lgh521911    时间: 2013-9-28 18:10
Always. 发表于 2013-9-24 22:53
我想应该是这样的: 我们执行代码的线程(文本框是有UI线程创建的)不是我创建空间的线程。
你的:public ...

多谢明白了





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2