首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

两个线程同是对办面操作会出现诈死

2013-08-27 
两个线程同是对办面操作会出现假死 delegate void delSelectMenu()delegate void delSetProgressBar()Th

两个线程同是对办面操作会出现假死

 delegate void delSelectMenu();
        delegate void delSetProgressBar();
        Thread thrSelectMenu = null;
        Thread thrSetProgressBar = null;
        private void ShowSelectMenu()
        {
            MytreeView.BeginInvoke(new delSelectMenu(InitMyTree));
            //this.BeginInvoke(new delSelectMenu(InitMyTree));
        }

        private void InitMyTree()
        {
            B_MENU_LIST Menu_ListBLL = new B_MENU_LIST();
            MytreeView.Nodes[0].Nodes.Clear();
            Menu_ListBLL.SelectMenu(MytreeView.Nodes[0], "00");
        }

        private void SetProgressBar()
        {
            while (true)
            {
                Thread.Sleep(100);
                if (thrSelectMenu.ThreadState == ThreadState.Stopped)
                {
                    toolStripProgressBar1.Value = 100;
                    break;
                }
                else
                {
                    if (toolStripProgressBar1.Value < 99)
                    {


                        toolStripProgressBar1.Value += 1;
                    }
                }
            }
        }

        private void dSetProgressBar()
        {
            statusStrip1.BeginInvoke(new delSetProgressBar(SetProgressBar));
            //this.BeginInvoke(new delSetProgressBar(SetProgressBar));
        }

      
        private void FrmMain_Load(object sender, EventArgs e)
        {
           
            thrSelectMenu = new Thread(new ThreadStart(ShowSelectMenu));
            thrSelectMenu.Start();

            thrSetProgressBar = new Thread(new ThreadStart(dSetProgressBar));
            thrSetProgressBar.Start();
        }


两个线程同时对界面操作,总是第二个线程要等第一个线程结束才会执行
还是就算是一个线程操作办面也会假死
[解决办法]
操作这么频繁,不卡才怪
[解决办法]
楼主没明白UI主线程执行的时机。要在界面上显示东西,只能是代理去执行(直到UI线程取到控制权的时候执行)。前些天刚好一个仁兄问道这个问题,我就写了一个小例子,楼主看一下就完全明白是怎么回事了。帖子的地址:http://bbs.csdn.net/topics/390544104

[解决办法]
引用:
两个线程同时对界面操作,总是第二个线程要等第一个线程结束才会执行
还是就算是一个线程操作办面也会假死



当你写 ctrl.BeginInvoke(proc1) 和 ctrl.BeginInvoke(proc2) 之后,这两个方法自然是排队等待主线程调用,但是执行时自然是一先一后执行的!

如果要让界面看起来比较平滑,就要将你的两个过程内部流程细节编入BeginInvoke回调,而不是把整个过程编入。

在你的过程中,我不知道 InitMyTree 是个什么东东,这里只有3行代码,无法看出如何进行多线程设计的问题。但是对于 dSetProgressBar,它里边顶多只有while循环内部的某几行代码才要编入 BeginInvoke,而不是把整个while循环过程编入。

如果有100个过程,其中99个都已经将流程细节编入BeginInvoke了,可是有1个过程是吧它整个过程编入BeginInvoke,那么用户看起来也是这一个过程“忽然立刻”出现的,它也无法与其它99个过程交替出现。

热点排行