C # Пошаговое выполнение - PullRequest
1 голос
/ 15 июня 2010

Я создаю приложение, которое использует и 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) оценивается сразу, поэтому оно просто не работает.

Как заставить CLR ждать, пока API вернет удобный результат.

Примечание

Просто сделав что-то вроде:

  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.
  }

Работает и отображает результаты.

Есть ли способ сделать это, как?

Большое спасибо!

UPDATE:

Theres событие в API сканера:

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

Но я не знаю, как его использовать. Любая идея?

Ответы [ 3 ]

3 голосов
/ 15 июня 2010

Это действительно зависит от того, как работает API. Если scanner_api.Scan () имеет значение , блокирующее , то он будет сидеть на этой строке в ожидании результата. Как только он получит результат, if оценит. Это может привести к тому, что ваш пользовательский интерфейс перестанет отвечать на запросы, поэтому вам часто приходится реализовывать какие-то потоки, чтобы сделать это в фоновом режиме. Я догадываюсь из вашего вопроса, что этот API не работает.

Еще один способ, которым это может работать, - опрос . Вы часто проверяете, чтобы увидеть, каков результат. Вы не хотите постоянно проверять и использовать все свои ресурсы (например, ЦП), поэтому вы проверяете с интервалом. Ответ Шелдона с Таймером достигает этого.

По крайней мере, еще один способ работает с обратным вызовом . Вы отправляете API функцию обратного вызова для вызова, когда статус обновится. Это может быть реализовано как события (делегат), с которыми вы связываетесь, или обычный делегат, который вы передаете в качестве параметра. Вы часто будете видеть их реализованными как «OnStatusChanged», «OnCompleted» и т. Д.

По сути, все сводится к тому, что поддерживает API. Опрос обычно работает, остальные должны быть поддержаны. Если возможно, проверьте документацию по API для примеров.

1 голос
/ 15 июня 2010

Можно использовать таймер (см. MSDN: класс таймера ), который периодически проверяет, завершено ли сканирование или нет.

В качестве альтернативы можно использовать асинхронный вызов, который вызывает обратный вызовпроцесс сканирования завершен.Обратите внимание, что это более сложный способ.

1 голос
/ 15 июня 2010

Один путь будет с таймером.Установите таймер для проверки каждые несколько секунд, чтобы проверить значение в 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.)

...