Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从ISampleGrabber获取字符串并以第一种形式更新文本框_C#_Winforms_Directshow_Invoke_Directshow.net - Fatal编程技术网

C# 从ISampleGrabber获取字符串并以第一种形式更新文本框

C# 从ISampleGrabber获取字符串并以第一种形式更新文本框,c#,winforms,directshow,invoke,directshow.net,C#,Winforms,Directshow,Invoke,Directshow.net,我想通过另一个类更新我的UI,我已经尝试通过创建一个form1对象并使用一个方法更新textbox来实现这一点。这会导致一个错误,通知我设备运行不正常 那么,基本上我如何使用samplegrabber.cs类更新Form1上的文本框呢?这个类经常被调用,但是我只需要使用字符串 ISampleGrabber类调用SampleCB方法,该方法包括: public int SampleCB(double sampletime, IMediaSample sample) { if

我想通过另一个类更新我的UI,我已经尝试通过创建一个form1对象并使用一个方法更新textbox来实现这一点。这会导致一个错误,通知我设备运行不正常

那么,基本上我如何使用samplegrabber.cs类更新Form1上的文本框呢?这个类经常被调用,但是我只需要使用字符串

ISampleGrabber类调用SampleCB方法,该方法包括:

public int SampleCB(double sampletime, IMediaSample sample)
    {
        if (sample == null)
        {
            return -1;
        }
        try
        {
            int length = sample.GetActualDataLength();
            IntPtr buffer;          
            if (sample.GetPointer(out buffer) == 0 && length > 0)
            {
                Bitmap bitmapOfFrame = new Bitmap(width, height, stride, PixelFormat.Format24bppRgb, buffer);
            }                
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
        Marshal.ReleaseComObject(sample);
        return 0;
    }
form1对象是在if语句中创建的,即使我创建了该对象(即使没有
f1.updateTextBox(id);
)行,也会发生错误

“updateTextBox1”是在Form1中创建的:

    public void updateTextBox1(string id)
    {
        textBox1.Text = id;
    }
我收到的错误如下:

COMException(0x8007001F)连接到系统的设备不可用 功能正常


SampleCB
在侧线程上调用。您不应该在此回调中执行任何与UI相关的操作,相反,您可能希望将值存储在成员变量中,并指示您需要在UI线程上继续操作,例如,在正确的线程上继续操作。

是否有任何代码示例可供共享,以显示您的尝试?另外,你能发布准确的错误消息吗?添加了相关代码。我尝试使用给出的示例,但似乎无法使其工作。在我的
SampleCB
中,当前显示的是一个messagebox,我该如何说(因为没有更好的短语)“我完成了,这就是字符串”?你可以选择如何做,但是-因为你在寻找一件简单的事情-让我为你提供最好的,但应该是最容易理解的。在回调中,将字符串存储在内部变量中,并将另一个
bool
变量设置为
true
。然后在您的窗口/窗体上有一个计时器,它会定期回调其事件,从那里当您看到这个
true
,您也可以使用存储的字符串。所谓“回调其事件”是指在ISampleGrabber类中创建一个新函数并调用它吗?否,我的意思是添加到“正确”的回调中用户界面线程。这必须提前设置一次,而不是从SG回调(已经在“错误”线程上运行)设置。据我所知,您的意思是在我的UI线程/第一个表单中添加计时器吗?我回电话是什么事?很抱歉,我不理解,我对一次使用多个线程以及不同线程如何共享数据非常陌生。