繁体   English   中英

C#在另一个线程上引发事件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM