waesaeasea 2018-08-20 08:52 采纳率: 0%
浏览 1157
已采纳

通过线程循环读取数据,数据发生改变后,输出不变。

[DllImport("1.dll", EntryPoint = "fuck1", CharSet = CharSet.Auto)]
public static extern void fuck1(Int64 pid, Int64 address, out byte buf, int size);

private void xc1()
{
Int64 pid = int.Parse(textBox2.Text);
Int64 address = Convert.ToInt64(textBox4.Text);
byte m;
int size = int.Parse(textBox6.Text);
LD = true;
times = 0;

        while (LD)
        {
            Thread.Sleep(100);

            fuck1(pid, address, out m, size);

            try
            {
                textBox7.Text = m.ToString();
                Console.WriteLine(m);
                label8.Text = (times += 1).ToString();
            }
            catch (Exception e)
            {

            }
        }
    }
我通过 fuck1函数读取数据。循环读取数据的时候,如果数据改变输出的数据不改变。
但是不用循环,单词读取的时候数据改变以后再读取,就能读取到正确的值,请问一下为什么?
  • 写回答

2条回答 默认 最新

  • hxycsdn9159 2018-08-20 09:17
    关注

    两种写法给你:
    一:直接在UI线程里面死循环(就是你这种写法:加上Application.DoEvents()这句)
    while (LD)
    {
    Thread.Sleep(100);

            fuck1(pid, address, out m, size);
    
            try
            {
                textBox7.Text = m.ToString();
                Console.WriteLine(m);
                label8.Text = (times += 1).ToString();
            }
            catch (Exception e)
            {
    
            }
                        Application.DoEvents();
        }
    

    第二种写法(启动另外的线程去做循环,然后使用invoke()方法显示UI)
    Thread td = new Thread(()=>{
    while (LD)
    {
    Thread.Sleep(100);

            fuck1(pid, address, out m, size);
    
            try
            {
                            this.Invoke(new Action(()=>{
                textBox7.Text = m.ToString();
                Console.WriteLine(m);
                label8.Text = (times += 1).ToString();
                                }));
            }
            catch (Exception e)
            {
    
            }
        }
    

    })
    td.IsBackground = true;
    td.Start();

    //以上两种方法都可以,然后解释一下为什么你那样不行,因为你再UI线程里面使用了死循环而且调用了Sleep()函数,你要理解Sleep()函数会使当前线程挂起,不接受任何消息,所以更新界面的消息自然不会被处理,所以你看到输出值不变,其实这个值一直在变,只不过你看不到罢了,另外你这样写出来的Form肯定是特别的“卡”,拖都拖不动,点上面的任何控件都不会有响应
    ,然后说下加Application.DoEvents()就可以的原因,是因为调用这个函数后即使你挂起UI线程,但是窗体仍然会处理响应各种消息
    第二种方法就是把循环写到另外一个线程,然后通过Invoke()方法回调显示结果,所以此时UI线程不会假死不会被挂起,所以可以正常更新界面

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 lammps拉伸应力应变曲线分析
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试,帮帮忙吧
  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建