簡體   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