2011-05-14 38 views
2

我正在實施生產者/消費者問題。代碼如下所示:如何檢測失效的控件?

void producer() 
{ 
    // produce item 
    // update some control in form 
} 

void consumer() 
{ 
    // consume item 
    // update some control in form 
} 

生產者和消費者的方法是在從創建我的形式一個不同的線程中執行,所以我不能在形式上更新的控制。我試過下面的代碼:

void producer() 
{ 
    // produce item 
    // put the work to be done in a queue 
    this.Invalidate(); 
} 

void consumer() 
{ 
    // consume item 
    // put the work to be done in a queue 
    this.Invalidate(); 
} 

所以現在我必須檢測表單是否已經失效。我查看了Form的事件列表,我能找到的最好的事情就是繪畫事件。我把代碼完成了工作,並且工作正常。問題是我懷疑我已經做到了正確的方式,儘管它有效。我認爲油漆不適合做這項工作,因爲我所做的不僅僅是繪畫。我想知道是否有更好的方法來做到這一點。

編輯 - 爲片段Invalidated事件處理程序不工作

public Form1() 
{ 
    InitializeComponent(); 
    this.Invalidated += InvalidateEventHandler; 
} 
void producer(object o) 
{ 
    // produce 
    // put work in queue 
    this.Invalidate(); 
} 
public void InvalidateEventHandler(object sender, InvalidateEventArgs e) 
{ 
    // Do Stuff to form -- Where exception raises 
} 

回答

4

Invalidate旨在觸發Paint。

你需要的是Control.Invoke()你自己的刷新方式。

編輯:

你非GUI線程甚至不應該調用invalidate(),也無法觸及的GUI。

您可以編寫自己的過程數據()的形式,方法和督促/缺點致電mainForm.Invoke(ProcessData)

然後ProcessData()負責將數據線程安全的訪問和無效的GUI

+0

也許我不明白但是如何解決我的執行線程不是創建者的問題?您能否解釋一下? – atoMerz 2011-05-14 10:28:11

+0

Invoke是爲了解決這個問題而創建的。 – 2011-05-14 10:30:25

+0

謝謝,它工作正常。 – atoMerz 2011-05-14 10:39:10

1

你可以嘗試使用new關鍵字,使自己實現的Invalidate的

public new void Invalidate() 
    { 
     // place your logic here 
     base.Invalidate(); 
    } 

ASLO形式有Invalidated事件至極觸發Ivalidate結束後

編輯:

public void InvalidateEventHandler(object sender, InvalidateEventArgs e) 
{ 
    anotherForm.Invoke(new Action(() => 
    { 
     // Do Stuff to form -- Where exception raises 
    })); 
} 
+0

@Stecya哎呀!是的,它確實有Invalidated事件,但它不顯示在屬性窗口中,idk爲什麼,我在代碼中試過並顯示它。但關於使用我自己的Invalidate()實現,不,它不會工作,因爲我調用Invalidate與除創建我的窗體之外的線程,所以它將是一個執行Invalidate,我會有同樣的問題。 – atoMerz 2011-05-14 10:19:07

+1

然後使用事件是你的解決方案 – Stecya 2011-05-14 10:20:28

+1

不幸的是,它不工作,我不知道爲什麼。我爲Invalidated事件添加了一個新的事件處理程序,當它被執行時,我得到的錯誤是關於它從另一個線程(而不是創建窗體的那個線程)更新的同一個錯誤。 :( – atoMerz 2011-05-14 10:25:15