2011-05-09 7 views
2

私はcontinuos監視が必要なコントロールがたくさんあるwinformアプリケーションがあります。たとえば、ボタンがあり、2つのボタンが無効になっている場合にのみ有効にし、別のボタンでは無効にする必要があります。それでは、私が今やっていることは、それは私はそれが私には間違っているようで必要なものんが、このようなスレッドを使用する以外のC#でコントロールを監視する

while(true) 
{  
if(btn.enabled==false and btn1.enabled==false) 
{ 
bt3.enabled==true 
} 
} 

としてcontinuos whileループに他の二つのボタンを監視するためにスレッドを使用しています。また、私のコントロールを管理するために必要なスレッドの数を考えると非常に高価ですが、アクションを実行してスレッドを実行できるようになる前に、5〜6種類の異なるチェックが必要な特定のコントロールがあります。

この

+0

タイマーの使用はどうですか?スレッドの問題は解決されますが、変更を行うたびにbt3.enabled値を設定するか、プロパティを使用してbtnとbtn1を設定するだけでよいと考えています。これらのプロパティでは、evalauteとbt3.enabledを設定します –

答えて

6

を行うには、他の方法があれば教えてくださいだけでなく、非効率的で、それが間違っているということです。スレッド親和性のため、UIスレッド以外のコントロールのプロパティにアクセスすることは絶対に避けてください。 設定のプロパティ(有効な割り当て)は特に悪いですが、それらを読み取る(有効になっているチェック)のが十分です。

イベント通知に基づいて、継続的な監視ではなく、自身をに更新する必要があります。たとえば、2つのボタンにEnabledChangedをフックします。

// (in the form initialization code) 
btn.EnabledChanged += UpdateButtons; 
btn1.EnabledChanged += UpdateButtons; 

//... 
private void UpdateButtons(object sender, EventArgs args) 
{ 
    bt3.Enabled = !btn.Enabled && !btn1.Enabled; 
} 

Enabledプロパティを変更するコードで(代わりに)これを行うこともできます。

+0

私のアプリでこの非効率的なメソッドをたくさんやっています。たとえば、すべての私のマルチスレッドアプリケーションでは、自分自身が別のスレッドからUI要素にアクセスしていることがわかります。しかし、私は代理人を使用し、invokerequiredを使用してクロススレッドコールを世話しました。あなたの答えを読んで、私はそれができなくてもいいと感じています。 UI要素へのクロススレッドコールを行う必要があるときに行う最良のオプションは何ですか? – swordfish

+0

@swordfishも、実際にはInvokeとBeginInvokeの2つしか選択できません - そして、ほとんど同じことをします... –

関連する問題