1

スキャナー API と画像から他の形式へのコンバーターを使用するアプリを構築しています。これを行うメソッド(実際にはクリックイベント)があります:

  private void ButtonScanAndParse_Click(object sender, EventArgs e)
  {
     short scan_result = scanner_api.Scan();

     if (scan_result == 1)
        parse_api.Parse(); // This will check for a saved image the scanner_api stores on disk, and then convert it.
  }

問題は、if 条件 (scan_result == 1) がすぐに評価されるため、機能しないことです。

API が便利な結果を返すまで CLR を強制的に待機させるにはどうすればよいですか。

ノート

次のようなことをするだけで:

  private void ButtonScanAndParse_Click(object sender, EventArgs e)
  {
     short scan_result = scanner_api.Scan();
     MessageBox.Show("Result = " + scan_result);
     if (scan_result == 1)
        parse_api.Parse(); // This will check for a saved image the scanner_api stores on disk, and then convert it.
  }

動作し、結果を表示します。

これを行う方法はありますか?

どうもありがとうございました!

アップデート:

スキャナー API にイベントがあります。

Public Event EndScan() // Occurs when the scanned the image.

しかし、私はそれを使用する方法がわかりません。何か案が?

4

3 に答える 3

3

それは本当にAPIがどのように機能するかに依存します。Scanner_api.Scan()がブロックしている場合は、その行に座って結果を待ちます。結果が得られると、ifが評価されます。これにより、UIが応答しなくなる可能性があるため、バックグラウンドで実行するには、多くの場合、何らかのスレッドを実装する必要があります。あなたの質問から、このAPIが機能する方法ではないと推測しています。

これが機能するもう1つの方法は、ポーリングを使用することです。あなたは結果が何であるかを見るために時々チェックします。常にチェックしてすべてのリソース(CPUなど)を使い果たしたくないので、定期的にチェックします。タイマーを使ったシェルドンの答えはこれを達成します。

これが機能するもう1つの方法は、コールバックを使用することです。ステータスが更新されたときに呼び出すコールバック関数をAPIに送信します。これは、結び付けるイベント(デリゲート)またはパラメーターとして渡す通常のデリゲートとして実装できます。これらは「OnStatusChanged」、「OnCompleted」などとして実装されていることがよくあります。

基本的に、それはAPIがサポートするものにかかっています。ポーリングは通常は機能しますが、他のポーリングはサポートされている必要があります。可能であれば、APIドキュメントで例を確認してください。

于 2010-06-14T21:59:23.807 に答える
1

1つの方法は、タイマーを使用することです。数秒ごとにチェックするようにタイマーを設定して、scan_result の値をチェックします (これを機能させるには、クラス レベルの変数に昇格する必要があります)。

したがって、次のようなものです:

public class Scanning
{
    private System.Timers.Timer aTimer;
    short scan_result;

    public Scanning()
    {
        aTimer = new System.Timers.Timer(1000);

        // Hook up the Elapsed event for the timer.
        aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
    }

    private void ButtonScanAndParse_Click(object sender, EventArgs e)
    {
       aTimer.Enabled = true;

       scan_result = scanner_api.Scan();
    }    

    private void OnTimedEvent(object source, ElapsedEventArgs e)
    {
       if (scan_result == 1)
       {
          aTimer.Enabled = false;

          parse_api.Parse(); // This will check for a saved image the scanner_api stores on disk, and then convert it.
       }
    }
}

(もちろん、これはテストされていません。YMMV.)

于 2010-06-14T21:22:39.657 に答える
1

スキャンが既に完了しているかどうかを定期的にチェックするタイマー ( MSDN: タイマー クラスを参照) を使用できます。

または、スキャン プロセスが終了したときにコールバックする非同期呼び出しを使用することもできます。これはより複雑な方法であることに注意してください。

于 2010-06-14T21:26:47.387 に答える