0

私のプロジェクトでは、メインフォームがあります。そのメインフォームで、実行時にユーザーコントロールを呼び出しています。このように実行されるイベントのシーケンス。

  1. バーコードをスキャンします-このコードでいくつかのプロセスを実行します

  2. ユーザーに「もっとスキャンしますか?」と尋ねます。次に、「はい/いいえ」オプションを表示します。これはポップアップウィンドウではありません。キオスク用のタッチスクリーンコンピュータの画面上のメッセージを更新する必要があります。

  3. ユーザー入力をしばらく待ちます。

  4. ユーザーが「はい」をクリックした場合は、他のバーコードを受け入れます。

  5. ユーザーが「いいえ」をクリックした場合は、さらに処理を行います。

  6. ユーザーがタイムリーに返信しない場合は、「いいえ」の返信と同様にさらに処理を行います。

質問:

  1. スレッドの間にボタンを表示するにはどうすればよいですか?

  2. ユーザーからの返信の場合のボタンクリックイベントの処理方法。

    void ShowMoreVoucherOption(bool showhide)
    {
        if (this.btnYes.InvokeRequired)
        {
            this.BeginInvoke((MethodInvoker)(() => btnYes.Visible = showhide));
            this.BeginInvoke((MethodInvoker)(() => btnNo.Visible = showhide));
        }
        else
        {
            btnYes.Visible = true;
            btnNo.Visible = true;
        }
        Application.DoEvents();
    }
    

私はこのルーチンを以下のスレッドの間に呼び出しています。これはUIスレッドではありません。

UpdateProgessLabel("Would you like to add more vouchers?");
ShowMoreVoucherOption(true);
Thread.Sleep(15000);
Dofuthrerporcessing(); // in case user does not give input

ここで、15秒間待ちます。ユーザーが入力した場合はボタンクリックイベントを続行し、そうでない場合はここで続行します。

ここでThread.sleepが適切かどうかはわかりません。または、ManualResetEventとwaitoneを使用する必要がありますか?そこのボタンクリックを処理する方法は?

4

2 に答える 2

0

UIスレッドにいるかどうかがまったくわからない場合(これがこの質問のポイントのようです)、バックグラウンドスレッドを作成して作業を行う必要があります。最も簡単なことは、次のことです。

if(SomeKindOfAFormOrAControl.InvokeRequired) // You are not in the UI Thread
{
  Thread.Sleep(15000);
  UpdateProgessLable("Your message.");
}
else // You are in the UI Thread
{
  ThreadPool.QueueUserWorkItem(delegate {  // Spawn a Background Thread
    Thread.Sleep(15000);
    UpdateProgessLable("Your message.");
  });      
}
//Your UI thread will keep running from this point if
//SomeKindOfAFormOrAControl.InvokeRequired was false.

これはあなたが探しているものですか?

編集:

UI スレッドでは、Invoke を呼び出す必要はなく、そこから UI を操作できます。実際のところ、UI スレッドにいないときに Invoke を呼び出す必要があります。そう:

15 秒後にボタンを非表示にする必要があるのが UI スレッドである場合は、上記のコードで行ったように、バックグラウンド スレッドで実行する必要があります。

ThreadPool.QueueUserWorkItem(delegate {  // Spawn a Background Thread
    Thread.Sleep(15000);
    ShowMoreVoucherOption(true);
  }); 

UI スレッドでない場合は、次のコードで十分です。

Thread.Sleep(15000);
UpdateProgessLable("Your message.");

UI を含むマルチスレッドに関する十分な情報がないと思います。それについてもっと学ぶか、これらの解決策を試して、あなたが幸運であることを願っています.

于 2013-02-05T19:59:44.730 に答える
0

Thread.Sleep ね?あなたの仕様(コードではない)を見ると、私はこのようには行きません。バーコードをスキャンしてタイマーを開始します。ユーザーが時間内に [はい] をクリックするたびにタイマーをリセットします。ユーザーがチャンスを逃した場合は、ユーザー入力の受け入れを停止し、既にスキャンされたものを処理します。ユーザー入力とタイマーの両方を同時に処理しないように、なんらかの形式でロックを解除する必要があり、不要な Tread.Sleep を取り除きます。

于 2013-02-05T21:53:44.400 に答える