cheerfortwdd 2016-05-24 01:39 采纳率: 100%
浏览 1191
已采纳

子子线程控制winform窗体控线显示无效

大家好:
首先有一个线程做图像采集:

imgProc_Task = new Thread(new ThreadStart(ImageProcessing));
imgproc_Task.start();

然后,在 ImageProcessing中没采集一次图像我会调用一个方法刷新一个控件的显示:
ShowlblImageCount_Invoke(intReadImageCount.ToString());
这个方法实现为:
public void ShowlblImageCount_Invoke(string str)
{
try
{
if (this.lblImageCount.InvokeRequired)
{
LblStrAction inst = new LblStrAction(Showlabel);

                this.BeginInvoke(inst, this.lblImageCount, str);
            }
            else
            {
                Showlabel(this.lblImageCount, str);
            }
        }
        catch (Exception e)
        {

        }
    }

            void Showlabel(Label lbl, string str)
    {
        try
        {
            lbl.Text = str;
        }
        catch (Exception ex)
        {

        }
    }
            到这里为止是没有问题的

            然后同样在ImageProgressIng这个方法里新建一个线程:
            Thread th2 = new Thread(new ThreadStart(new ThreadDeal((Bitmap)(bimage[bufferReadind].Clone())).ImageDealThread));
                        th2.Start();
            其中ThreadDeal是一个封装方法的类,方法名叫ImageDealThread.
            到此为止相当于是一个子子线程了。

            执行ImageDealThread会调用一个方法,控制其他控件刷新:                
            ShowlblLogedCount_Invoke((VarSVCamera.V_I.g_IntLogedCount++ + 1).ToString());
                            使用的方法跟之前的一样
                            问题出现了,如果按照上面的逻辑去做,第一个控线显示是可以视线的,第二个就没反应了
                            在第二个实现方法中的control.invokeRequired一直为false.
  • 写回答

1条回答 默认 最新

  • cheerfortwdd 2016-05-24 02:16
    关注

    解决了,虽然步子到为啥,希望对别人有点用:
    Thread t = new Thread(delegate(){ DealImage((Bitmap)(bimage[bufferReadind].Clone())); });
    如上这样去新建一个线程。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 matlab有关常微分方程的问题求解决
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable