C# 从ISampleGrabber获取字符串并以第一种形式更新文本框
我想通过另一个类更新我的UI,我已经尝试通过创建一个form1对象并使用一个方法更新textbox来实现这一点。这会导致一个错误,通知我设备运行不正常 那么,基本上我如何使用samplegrabber.cs类更新Form1上的文本框呢?这个类经常被调用,但是我只需要使用字符串 ISampleGrabber类调用SampleCB方法,该方法包括: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
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线程/第一个表单中添加计时器吗?我回电话是什么事?很抱歉,我不理解,我对一次使用多个线程以及不同线程如何共享数据非常陌生。