Читаем C# 4.0: полное руководство полностью

В первой форме ожидание длится вплоть до уведомления об освобождении объекта, а во второй форме — как до уведомления об освобождении объекта, так и до истечения периода времени, на который указывает количество миллисекунд_простоя. В обеих формах obj обозначает объект, освобождение которого ожидается.

Ниже приведены общие формы методов Pulse() и PulseAll():

public static void Pulse(object obj)

public static void PulseAll(object obj)

где obj обозначает освобождаемый объект.

Если методы Wait(),Pulse() и PulseAll() вызываются из кода, находящегося за пределами синхронизированного кода, например из блока lock, то генерируется исключение SynchronizationLockException.

Пример использования методов Wait() и Pulse()

Для того чтобы стало понятнее назначение методов Wait() и Pulse(), рассмотрим пример программы, имитирующей тиканье часов и отображающей этот процесс на экране словами "тик" и "так". Для этой цели в программе создается класс TickTock, содержащий два следующих метода: Tick() и Тоск(). Метод Tick() выводит на экран слово "тик", а метод Тоск() — слово "так". Для запуска часов далее в программе создаются два потока: один из них вызывает метод Tick(), а другой — метод Тоск(). Преследуемая в данном случае цель состоит в том, чтобы оба потока выполнялись, поочередно выводя на экран слова "тик" и "так", из которых образуется повторяющийся ряд "тик-так", имитирующий ход часов.

//Использовать методы Wait() и Pulse() для иммитации

//тиканья часов

using System;

using System.Threading;

class TickTock {

  object lockOn = new object();

  public void Tick(bool running) {

    lock(lockOn) {

      if(!running) { // остановить часы

        Monitor.Pulse(lockOn); // уведомить любые ожидающие потоки

        return;

      }

      Console.Write("тик ");

      Monitor.Pulse(lockOn); // разрешить выполнение метода Tock()

      Monitor.Wait(lockOn);    // ожидать завершения метода Tock()

    }

  }

  public void Tock(bool running) {

    lock(lockOn) {

      if(!running) { // остановить часы

        Monitor.Pulse(lockOn); // уведомить любые ожидающие потоки

        return;

      }

      Console.WriteLine("так");

      Monitor.Pulse(lockOn); // разрешить выполнение метода Tick()

      Monitor.Wait(lockOn);    // ожидать завершения метода Tick()

    }

  }

}

class MyThread {

  public Thread Thrd;

  TickTock ttOb;

  // Сконструировать новый поток.

  public MyThread(string name, TickTock tt) {

    Thrd = new Thread(this.Run);

    ttOb = tt;

    Thrd.Name = name;

    Thrd.Start();

  }

  // Начать выполнение нового потока,

  void Run() {

    if(Thrd.Name == "Tick") {

      for(int i=0; i<5; i++)

        ttOb.Tick(true);

      ttOb.Tick(false) ;

    }

    else {

      for(int i=0; i<5; i++)

        ttOb.Tock(true);

      ttOb.Tock(false);

    }

  }

}

class TickingClock {

  static void Main() {

    TickTock tt = new TickTock();

    MyThread mt1 = new MyThread("Tick", tt);

    MyThread mt2 = new MyThread("Tock", tt);

    mt1.Thrd.Join();

    mt2.Thrd.Join();

    Console.WriteLine("Часы остановлены");

  }

}

Ниже приведен результат выполнения этой программы.

тик так

тик так

тик так

тик так

тик так

Часы остановлены

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных