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