3

私のC#プロジェクトでは、Timer.One(keyboard_timer)を使用して、ユーザーがF8を押すかどうかを監視し、別のTimer(clipboard_time)は、クリップボードにテキストが含まれるかどうかを監視します。私のプロジェクトでは、キーボードは常に有効になっています。ユーザーがF8キーを押すと、clipboard_timerが有効になります。ユーザーがもう一度F8キーを押すと、clipboard_timerが無効になります。私のプロジェクトの機能ユーザーがF8キーを押して単語をコピーすると、プロジェクトはコピーされた単語の意味をウィンドウに表示します。私のプログラムはバックグラウンドで実行され、ユーザーがF8を押すかどうかを常に確認します。その後、プログラムがクリップボードをチェックします。クリップボードにテキスト(単語)が含まれているかどうか、毎回単語の意味が表示されるかどうかを確認します。私のコードはここにあります:

初期化時

   keyboard_timer.Enabled = true;
        keyboard_timer.Tick += new EventHandler(keyboard_timer_Tick);

それから

  public void keyboard_timer_Tick(object sender, EventArgs e)
    {
        // clipboard enable
        if ((a % 2) != 0)
        {
      //  F9 is for Easy mood to eanble

             if ((GetAsyncKeyState(Keys.F9) == -32767) && hot_key == "F9")
            {
                label2.Text = "Easy";
                online_clipboard_active = "";
                Clipboard.Clear();
                clipboard_timer.Enabled = true;
                clipboard_timer.Tick += new EventHandler(clipboard_timer_Tick);
               ++a;           
            }


    ///// // F8 is for online Mood
            else if ((GetAsyncKeyState(Keys.F8) == -32767) && online_hot_key == "F8")
            {
                label2.Text = "Online";
                online_clipboard_active = "on";
                clipboard_timer.Enabled = true;                    
                clipboard_timer.Tick += new EventHandler(clipboard_timer_Tick);

                ++a;

            }

        }// end of enable 


        //clipboard disable
        if ((a % 2) == 0) // 
        {
            // F9 is for Easy mood to disable here
            if ((GetAsyncKeyState(Keys.F9) == -32767) && hot_key == "F9")
            {
                   label2.Text = "Off";
                    clipboard_timer.Enabled = false;
                    ++a;
            }

            // F8 is for online Mood to disable here
             else  if ((GetAsyncKeyState(Keys.F8) == -32767) && online_hot_key == "F8")
            {
                label2.Text = "Off";
                online_clipboard_active = "";
                clipboard_timer.Enabled = false;
               ++a;                   
            }

        }//end of clipboard disable

    }// end of keyboard timer

クリップボードタイマーは

 public void clipboard_timer_Tick(object sender, EventArgs e)
    {

        if (Clipboard.GetDataObject().GetDataPresent(DataFormats.Text))
        {
            string x = Clipboard.GetText();
            Clipboard.Clear();

            if ((a%2)==0 && online_clipboard_active == "on")
            {
                //cal online_mood form to translate the string from googletranslator
                online_mood o = new online_mood(x);
                o.Show();
            }

            else if((a%2)==0 && online_clipboard_active == "")
            {
                //cal show_meaning form to show the meaning into a window
                show_meaning s = new show_meaning(x);
                s.Show();
            }        
        }

    }// end of clipboard timer Tick

その時間にクリップボードタイマーを有効にすると、両方とも変数を使用するため、キーボードタイマーがロックされるようにしたいと思います。クリップボードタイマーが実行されると、キーボードタイマーがロックされ、クリップボードタイマーが終了すると、キーボードタイマーが再びアクティブになります。これを解決するにはどうすればよいですか。誰かが私に助けをくれますか?????

4

2 に答える 2

0

単純なロックは、静的メンバーで実現できます。

private static readonly object Sync = new object();

次に、情報を設定または取得する前に使用します

lock(Sync)

変数をロックします。

ところで:あなたがやろうとしていることはわかりません。おそらく、タイマーの代わりにフォームの Keypress イベントを使用する必要があります。

于 2013-03-07T14:04:28.143 に答える
0

C# ロックを調べる

あなたは基本的にこれを行います:

public Object lockObject = new Object(); //You want a separate object so that it's not changed when lock is active


...    
//Code that can be run by any number of thread at the same time
...

lock(lockObject)
{
     ...
     //Code that is accessable by only one thread at a time:
     ...
}

...    
//Code that can be run by any number of thread at the same time
...

これが少し役立つことを願っています。

于 2013-03-07T14:01:34.187 に答える