[英]C# Raise events on another thread
我有MainForm
类和一些用于相机控制的Engine
类。 在Engine
类中,我有一些Camera
对象,它是Camera
producer的SDK的一部分。 该Camera
具有可用的OnNewFrame
事件,因此我将初始化:
camera.OnNewFrame += frameAcquired;
frameAcquired
也是Engine类的成员。
private void frameAcquired(object sender, EventArgs e)
{
/* this event should periodically raise after ~17ms,
but sometimes it hangs for a short time
(when I overloads main thread) */
}
Engine
对象是MainForm
类的成员。 在这里,我将显示来自相机的图像并进行其他一些图形处理。 问题在于MainForm
线程有时会挂起很短的时间。 它对于显示不是很关键,但对于camera.OnNewFrame
事件(我正在以60 fps进行操作)进行,因为这也由于主线程延迟而被延迟。
是否有可能确保一些方式,即Engine
对象(或Camera
中的对象Engine
)将提高事件的从它自己的线程,而不是从主线程? 换句话说,确保此事件提高了SDK生产者设置的速率,而不依赖于我的主线程。
不久前,我遇到了类似的问题。 我已经在C ++ / CLI中进行了处理,因此相同的方法也应该在C#中也可以使用。
我相信您已经在MainForm中初始化了Engine类。 如果要从另一个线程引发事件,则必须在另一个线程中初始化此对象。
我相信您应该尝试在MainForm构造函数中创建一个新的Thread :
MyForm()
{
//rest of your constructor
cameraThread = new Thread(new ParameterizedThreadStart(CameraRun));
cameraThread.Name = "Camera Thread";
cameraThread.Start(this);
while (!cameraThread.IsAlive)
Thread::Sleep(1);
}
这样,您可以在MyForm类中为cameraThread保留一个字段。 尽管如此,您仍然需要编写一个函数来运行新线程。 我们知道它将初始化您的Engine类,但这还不是全部。 为了确保线程没有完成您赋予它的运行功能,请在线程功能的底部添加一些检查,如下所示:
void CameraRun(Object myForm)
{
//you can use (myForm as MyForm)
//and make calls from here
/*
Engine initialization etc
*/
while((myForm as MyForm).isShown)
Sleep(100);
}
cameraThread应该重新加入MainForm析构函数中的主代码。
~MyForm()
{
//rest of your destructor
this.isShown=false;
cameraThread.Join();
}
您可以根据需要将this.isShown = false行添加到OnFormClosed()事件中。
如果您走了这么远,那太好了。 但是,很遗憾,您尚未完成。 在处理多个线程时,必须确保以线程安全的方式访问对象。 长话短说,检查此答案 。
编辑:一些更正
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.