回 帖 发 新 帖 刷新版面

主题:[原创]达人帮帮我啊,关于线程的一个问题

达人帮我看看,下面是我的一个测试代码。当单击一个Button时,启动一个线程,这
个线程去执行
一个控件的方式,通过这个控件去控制硬件,这个SetPowerRelay(short)执行完需要
8s时间,
而这个线程去执行时,cpu占用很小的,但是界面很卡,拖都拖不动,而当
这个线程执行完后,界面又恢复正常,问这是什么原因啊?怎么改才能使得界面总是
正常的呢?

    public partial class Form1 : Form
    {
        private Thread thread = null;
        public Form1()
        {
            InitializeComponent();
            Thread thisThread = Thread.CurrentThread;
            thisThread.Priority = ThreadPriority.Highest;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            thread = new Thread(new ThreadStart(SetStart));
            thread.Priority = ThreadPriority.Lowest;
            thread.Start();
        }
        private void SetStart()
        {
            axCL2005Ocx1.ComInitial((short)1, 38400, 100);
            axCL2005Ocx1.SetLEDProperty((short)2, (short)1, (short)48, (short
)32, (short)1, 1);
            axCL2005Ocx1.SetPowerRelay((short)0); 
       //SetPowerRelay此方法执行完需要8s时间,是封装好的,无法加入Sleep()
和DoEvents().
            axCL2005Ocx1.CloseCL2005();
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs 
e)
        {
            if (!this.IsDisposed)
                this.Dispose();
        }
    }

虽然没有用BeginInvoke和Invoke,但这个axCL2005Ocx1是个对象,很早就初始化好了
的啊,而且
不用BeginInvoke也不会造成这个样子啊。即使我开一个线程对button1.Text进行写
操作也不会这样子的啊
如:
    private void button1_Click(object sender, EventArgs e)
        {

            thread = new Thread(new ThreadStart(threadst));
            thread.Priority = ThreadPriority.Lowest;
            thread.Start();
        }

        private void threadst()
        {

            long sum = 0; 
            try
            {
                while (true)
                {
                    sum = 0;
                    for (int i = 0; i < 1000000; i++)
                    {
                        for (int j = 0; j < 1000000; j++)
                        {
                            for (int k = 0; k < 1000000; k++)
                            {
                                button1.Text=k.ToString();  //对button1.Text
进行写操作
                                sum++;
                            }
                        }

                    }
                    
                }

            }
            catch (ThreadAbortException)
            {
                Thread.ResetAbort();
            }
        }

即使这样,cpu占用率很高,但是界面也还是很流畅的啊。怎么我对那个控件就不能
做到界面流畅呢?
达人帮帮我啊,我为这个问题都头疼了好几天了。怎么解决啊?

回复列表 (共1个回复)

沙发

怎么说呢,控件是会反馈到界面的
所以,操作控件会占用ui,不用invoke会更加卡
因此,最好能在新线程中初始化控件而不是事先拖到界面上(如果可以的话)

我来回复

您尚未登录,请登录后再回复。点此登录或注册