我的應用程序使用圖像處理庫來處理長時間運行的任務。帶有設置和控件的主UI在WPF中實現。需要顯示圖像處理,並且主UI需要保持響應。在主UI中點擊'進程'按鈕會產生一個新的線程,它會創建一個新的WinForm窗口來顯示處理過的圖像。使用不同窗口與兩個UI線程交互
在它是多線程之前,UI會在處理過程中掛起,進程將在用於顯示圖像的WinForm。然後,當處理完成時,WinForm將保留其中的圖像。事件被添加到允許平移和縮放的新WinForm中。平移和縮放功能正常工作。
由於項目需要多線程才能正常工作,這變得很明顯。
現在使用新線程創建WinForm窗口,並像以前那樣創建圖像並進行處理和顯示。問題是,當這個方法完成時,線程退出。線程退出意味着如果分配的映像緩衝區未被釋放,那麼應用程序將拋出異常。爲了解決這個問題,在線程退出前有一個方法叫釋放所有的分配。這修復了異常並使整個線程成功執行,但這意味着圖像顯示緩衝區和顯示它的窗體被釋放/處置,因此縮放和平移事件沒有時間可用。
使線程不退出的最佳解決方案是創建一個AutoResetEvent並在圖像處理線程的末尾具有類似的內容。
while (!resetEvent.WaitOne(0, false)) { }
threadKill(); // frees all allocations
AutoResetEvent由殺死線程的主UI上的按鈕觸發。這可以使用戶根據需要儘可能長時間地顯示圖像並將其殺死,但它無法觸發使圖像平移和縮放所需的單擊和拖動事件。有沒有辦法讓線程不會退出,而沒有一個旋轉的while循環來防止事件被觸發?所需的功能是讓線程保持活動狀態,以便不必釋放分配,並且可以實現平移和縮放。
儘管解決方案對於具有更多體驗線程的人來說可能是顯而易見的,但任何幫助都將被讚賞,因爲我是多線程應用程序的新手。
由於
編輯:應當知道,最終目標是要顯示的以這種方式從幀接收器採取處理的幀的恆定流。所以我不認爲它會在後臺單獨處理它們,然後將它們顯示在主UI中,因爲需要持續顯示流,這會鎖定主UI。
編輯:問題的真正意圖是不找到更好的方式來做類似的事情。相反,我問是否可以停止新線程退出,以便點擊事件可以觸發。如果System.Threading.Thread無法實現這種行爲,那麼說它無法實現也將是一個被接受的答案。
謝謝你的廣泛答案。然而,最有可能無法工作的原因有兩個。第一個是我必須使用C#3.5,第二個是看起來這個代碼處理圖像本身的實際顯示。爲了獲得所需的FPS,成像庫必須顯示圖像緩衝區。這就是爲什麼介紹WinForm的原因,因爲成像庫需要傳遞一個窗口句柄作爲參數。 雖然感謝 – Fultonae 2010-07-30 14:17:36