none
Функция ожидания RRS feed

  • Вопрос

  • Подскажите, как сделать нечто подобие Dim result? As Boolean = FileDialog.ShowDialog(), только без диалогов, просто что бы переменная ждала получения результата фанкции не сильно загружая процессор? Пока идет пересылка данных, необходимо подождать, пока не перешлется, затем посмотреть состояние переменной. Если в цикле While делать, программа зависает. Может можно как-то с таймером сделать? Или может когда переменная изменится, продолжить выполнение процедуры.. Подскажите как решить данную проблемку 
    • Перемещено Abolmasov Dmitry 3 августа 2011 г. 11:45 (От:Настольные ПК)
    19 июля 2011 г. 9:45

Ответы

  • Даже наверное лучше вместо переменной test использовать не lock, а мьютекс - Mutex или AutoResetEvent. Мьютекс сразу занятым и ждать освобождения в функции, которую нужно приостановить, или ждать сигнала от AutoResetEvent.


    Для связи [mail]
    • Помечено в качестве ответа Siompc 22 июля 2011 г. 17:24
    20 июля 2011 г. 5:48
  • Вот например, TestFunc ждет сигнала от ClientFunc, и далее продолжает работать (язык C#, но думаю тут ничего тяжелого и незнакомого нет):

    using System;
    using System.Threading;
    
    namespace ConsoleApplication2
    {
      class Program
      {
        static AutoResetEvent waitEvent = new AutoResetEvent(false);
    
        static void Main(string[] args)
        {
          Thread t1 = new Thread(new ThreadStart(TestFunc));
          Thread t2 = new Thread(new ThreadStart(ClientFunc));
    
          t1.Start();
          t2.Start();
    
          Console.ReadLine();
        }
    
        static void ClientFunc()
        {
          while (true)
          {
            Thread.Sleep(3000);
            waitEvent.Set();
          }
        }
    
        static void TestFunc()
        {
          while (true)
          {
            Console.WriteLine("Verify");
            waitEvent.WaitOne();
            Console.WriteLine("Complete verify");
          }
        }
      }
    }
    
    

     


    Для связи [mail]
    • Помечено в качестве ответа Siompc 22 июля 2011 г. 17:24
    20 июля 2011 г. 9:18
  • Так на то он и сервер, что бы выдерживать большие нагрузки. Да и вероятность что все клиенты будут в ожидании не высока, работа то идет и очередь движется.
    • Помечено в качестве ответа Siompc 22 июля 2011 г. 17:24
    22 июля 2011 г. 5:23
    Отвечающий

Все ответы

  • Ожидайте окончание пересылке в другом потоке. Чтобы сильно не грузить в while'е сделайте Thread.Sleep.
    19 июля 2011 г. 10:09
    Модератор
  • Не получится. Это уже многопоточное приложение. Ожидать изменение переменной могут очень много клиентов, на каждий из них создавать по отдельному потоку - сервер упадет
    19 июля 2011 г. 10:28
  • А если создать свое событие?
     
    19 июля 2011 г. 10:44
    Модератор
  • Как? Вот это как раз и хотелось бы узнать :)
    19 июля 2011 г. 10:46
  • Разобрался немного, но что это может дать в моем случае? Как ждать, пока событие не произошло? Это ж в середине процедуры. Шла процедура, потом должна дождаться изменения переменной, и пойти дальше....
    19 июля 2011 г. 14:21
  • Все равно придется использовать While...
    19 июля 2011 г. 14:22
  • А где у вас происходит изменение переменной? В чем заключается ожидание, в весконечной проверки значения?


    Для связи [mail]
    19 июля 2011 г. 18:07
  • Изменение происходит в классе клиента. Другой клиент делает запрос, В процедуре этого запроса ведутся подсчеты, и в середине необходимо сверить информацию с другим клиентом. Пока будет эта информация сверяться, переменная, например Test? as boolearn будет равна Nothing. Как только она меняется на True или False, процедура дальше продолжает собирать информацию. Нужно как то сделать так, что бы ожидание было не бесконечной проверкой, так как это сильно нагружает сервер, а например через таймер, проверяло кажую 1/10 долю секунды, или просто остановить выполнение процедуры, пока переменная не изменится... Как это сделать?

    19 июля 2011 г. 19:42
  • Добрый день!

    Может быть в Вашем случае подойдёт механизм критических секций http://msdn.microsoft.com/ru-ru/library/c5kehkcz.aspx в случае если интерактивность остальных клиентов не требуется до момента завершения работы, клиентом изменяющим переменную.

    20 июля 2011 г. 4:28
  • Даже наверное лучше вместо переменной test использовать не lock, а мьютекс - Mutex или AutoResetEvent. Мьютекс сразу занятым и ждать освобождения в функции, которую нужно приостановить, или ждать сигнала от AutoResetEvent.


    Для связи [mail]
    • Помечено в качестве ответа Siompc 22 июля 2011 г. 17:24
    20 июля 2011 г. 5:48
  • Ух... совсем запутался. А можно самый простой пример по ожидпнию изменения любой переменной? Я еще не до конца понимаю, поэтому не разобрался в примерах MSDN
    20 июля 2011 г. 8:53
  • Вот например, TestFunc ждет сигнала от ClientFunc, и далее продолжает работать (язык C#, но думаю тут ничего тяжелого и незнакомого нет):

    using System;
    using System.Threading;
    
    namespace ConsoleApplication2
    {
      class Program
      {
        static AutoResetEvent waitEvent = new AutoResetEvent(false);
    
        static void Main(string[] args)
        {
          Thread t1 = new Thread(new ThreadStart(TestFunc));
          Thread t2 = new Thread(new ThreadStart(ClientFunc));
    
          t1.Start();
          t2.Start();
    
          Console.ReadLine();
        }
    
        static void ClientFunc()
        {
          while (true)
          {
            Thread.Sleep(3000);
            waitEvent.Set();
          }
        }
    
        static void TestFunc()
        {
          while (true)
          {
            Console.WriteLine("Verify");
            waitEvent.WaitOne();
            Console.WriteLine("Complete verify");
          }
        }
      }
    }
    
    

     


    Для связи [mail]
    • Помечено в качестве ответа Siompc 22 июля 2011 г. 17:24
    20 июля 2011 г. 9:18
  • + создать событие, подписаться на него. При наступлении события - обработчик показывает состояние переменной. Смотрите также многопоточность. Пример выше.

    Посмотрите также  метод Application.DoEvents  (для сервисов не подходит). В MSDN пример перерисовки формы при получении нового рисунка из openFileDialog

    http://msdn.microsoft.com/en-us/library/system.windows.forms.application.doevents.aspx



    20 июля 2011 г. 9:53
  • Спасибо Дминтрий! Хорошо когда много знаешь :) Еще один ньюанс, Так ожидать могут не один клиент, к примеру на 30 клиентов 30 потоков, это по 1 мб на стек :) Сервер упадет так? 
    21 июля 2011 г. 17:43
  • Так на то он и сервер, что бы выдерживать большие нагрузки. Да и вероятность что все клиенты будут в ожидании не высока, работа то идет и очередь движется.
    • Помечено в качестве ответа Siompc 22 июля 2011 г. 17:24
    22 июля 2011 г. 5:23
    Отвечающий
  • Не упадет.
    My blog | My Favorite Project
    • Помечено в качестве ответа Siompc 22 июля 2011 г. 17:23
    • Снята пометка об ответе Siompc 22 июля 2011 г. 17:24
    22 июля 2011 г. 16:58
    Модератор