从ISampleGrabberCB更新文本框

时间:2013-11-10 23:04:50

标签: c# winforms bitmap directshow directshow.net

我目前有一个工作程序,可以从我的网络摄像头显示预览并使用ISampleGrabberCB界面。

使用SampleCB我的程序将图像转换为位图,然后处理图像以获得条形码,然后对其进行解码。当我使用MessageBox显示结果时,这非常有效,但是当我希望在主窗体上编辑文本框时,我会在启动程序时遇到一些错误。

我正在尝试使用ISampleGrabberCB界面中的以下代码更新我的文本框:

public int SampleCB(double sampletime, IMediaSample sample)
    {
        if (sample == null)
        {
            return -1;
        }
        try
        {
            int length = sample.GetActualDataLength();
            IntPtr buffer;
            BitmapData bitmapData = new BitmapData();

            Form1 f1 = new Form1("", "", "");


            if (sample.GetPointer(out buffer) == 0 && length > 0)
            {
                Bitmap bitmapOfFrame = new Bitmap(width, height, pitch, PixelFormat.Format24bppRgb, buffer);


            }

方法changeTextBox1是我的主要形式,如下所示:

public void changeTextBox1(string text)
    {
        textBox1.Text = text;
    }

我得到的错误首先是A device attached to the system in not functioning properly,然后是no such supported interface。这似乎只有在我使用Form1 f1 = new Form1("","","");行时才会发生。

正如我所说的,如果我删除行Form1 f1 = new Form1("","","");并将changeTextBox1(result.Text);替换为MessageBox.Show(result.Text.ToString());,这就行了。

如何更新文本框而不是使用MessageBox?

1 个答案:

答案 0 :(得分:2)

您应该在主UI线程中进行UI更改,但是您的回调SampleCB将从另一个系统线程调用,因此会出现错误。使用消息发布或其他方式将数据从回调线程安全地传递到主UI线程,并使用主UI线程中的新数据更新UI。