Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.66/79: Рейтинг темы: голосов - 79, средняя оценка - 4.66
4 / 4 / 0
Регистрация: 21.04.2012
Сообщений: 132

Как приостановить работу программы на момент выполнения определенного кода

31.08.2012, 20:53. Показов 15214. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
день добрый,

у меня есть некоторый код, в определенном месте которого, я должен ждать пока переменная order_id, не поменяет свое значение. как только данная переменная изменится - двигаемся дальше. для этого я использую таймер. вот код:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 public string order_id = "0"; // переменная для хранения номер выставленной заявки. заявки обрабатываем в очереди, поэтому номер - один. 
       public string order_id_first = "0"; // как, только две этих переменных будут отличаться, значит вышел новый orderid
 
       void smartcom_ordersucceeded(int cookie, string orderid) // событие, если приказ на биржу выставлен успешно
       {
           order_id = orderid;
           logging_trade.log_add(this, "smartcom_ordersucceeded", "одрдер доставлен на сервер котировок. № заявки (cookie): " + cookie + ". № заявки (order_id): " + order_id , 2);
           
       }
 
 
public void timer4_Tick(object sender, EventArgs e) // таймер на ожидание прихода номера заявки после place_order
       {
           //logging_trade.log_add(this, "послать задание", "order_id для BUY STOP из таймера: " + order_id, 1);
           //timer4.Enabled = false;
 
           if (order_id != order_id_first) // если они равны, это или 0 = 0, при запуске программы или только что вышел новый orderid
           {
               order_id_first = order_id;
               logging_trade.log_add(this, "таймер 4", "вышел новый orderid. order_id для BUY STOP из таймера: " + order_id, 1);
               timer4.Enabled = false; // остановим таймер.
               new_orderid_flag = true; // флаг перехода к обработке следующей заявки
           }
           else
           {
               logging_trade.log_add(this, "таймер 4", "не новый orderid или первый запуск: " + order_id, 1); 
           }
       } // timer4_Tick
сам по себе код работает правильно, но когда я вызываю его из программы:

C#
1
2
3
                   timer4.Interval = 50;
                   timer4.Enabled = true;
                   logging_trade.log_add(this, "послать задание", "значение order_id: " + order_id, 4);
почему то таймер запускается и программа сразу продолжает выполняться дальше. выполнение доходит до

C#
1
logging_trade.log_add(this, "послать задание", "значение order_id: " + order_id, 4);
и я в значении order_id я получаю 0.

мне нужно сделать, что бы когда я вызываю таймер, то сначала он отработал - дождался нового значения orderid и после этого программа продолжилась бы выполняться с этого же места, там где я вызывал таймер. подскажите, как быть?

борис
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.08.2012, 20:53
Ответы с готовыми решениями:

Как приостановить работу программы, до нажатия кнопки?
Появляется форма, на ней кнопка. Программа должна приостановить выполнение, пока не будет нажата кнопка. clc I=imread('coins.png'); ...

Как приостановить работу программы на несколько секунд?
Добрый день. скажите пожалуйста, как приостановить работу программы на несколько секунд? Например, что бы создавалась иллюзия, что...

Приостановить работу сторонней программы
Добрый день.Подскажите как сделать блокировку окна какой-нибудь программы,пока работает другая программа,которая создала эту блокировку,но...

11
Неадекват
 Аватар для freeba
1501 / 1237 / 248
Регистрация: 02.04.2010
Сообщений: 2,807
31.08.2012, 21:32
Зачем таймер? Не проще использовать события.
1
4 / 4 / 0
Регистрация: 21.04.2012
Сообщений: 132
31.08.2012, 21:42  [ТС]
хм. а, как их прикрутить к моей задачи? я пока еще не мегамонстр программинга
0
Неадекват
 Аватар для freeba
1501 / 1237 / 248
Регистрация: 02.04.2010
Сообщений: 2,807
31.08.2012, 23:18
Легко. Вешаете событие на переменную изменение которой надо отслеживать. Как только она изменяется - в событии выполняете все необходимые проверки и действия. И ненужно процессор впустую гонять таймером
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
01.09.2012, 01:49
slinger, вот простенький пример:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
using System;
 
namespace ConsoleApplication7
{
    internal class A
    {
        private int _x;
 
        public int X
        {
            get { return _x; }
            set
            {
                _x = value;
                OnPropChanged(_x);
            }
        }
 
        public event EventHandler<int> PropChanged;
 
        public void OnPropChanged(int e)
        {
            var handler = PropChanged;
            if (handler != null)
                handler(this, e);
        }
    }
 
    internal class Program
    {
        private static void Main()
        {
            var a = new A();
            a.PropChanged += (sender, e) => Console.WriteLine("Property is changed. New value = {0}", e);
            for (int i = 0; i < 5; i++)
                a.X = i;
            Console.ReadKey();
        }
    }
}
3
 Аватар для Spectral-Owl
608 / 583 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
03.09.2012, 10:31
событие не то что проще... просто таймер вообще не из этой области. Его для этих целей использовать вообще нельзя т.к. он создает новый поток, который будет выполняться параллельно основному коду. Он не предназначен для остановки программы до определённого момента, а для выполнения каких-либо действий, пока одновременно с этим выполняются другие
0
 Аватар для mikhail_g
192 / 147 / 27
Регистрация: 02.05.2011
Сообщений: 467
03.09.2012, 11:02
http://msdn.microsoft.com/ru-r... event.aspx

Для приостановки потока на момент выполнения другого кода можно это покурить
0
4 / 4 / 0
Регистрация: 21.04.2012
Сообщений: 132
03.09.2012, 11:54  [ТС]
всем большое спасибо за ответы.

дело в том, что переменную order_id, я уже получаю в событии, которое наступает, как раз в тот момент, когда переменная order_id меняется (выходит новая). имеет ли смысл прикручивать еще одно событие? мне мажется - нужно просто ждать. то есть в заданном месте программы, нужно как бы притормозить и дождаться, когда событие пришлет переменную orderid. а, то что таймер создает еще один поток - это я уже понял из практики.

вот событие:
C#
1
2
3
4
5
6
  void smartcom_ordersucceeded(int cookie, string orderid) // событие, если приказ на биржу выставлен успешно
       {
           order_id = orderid;
           logging_trade.log_add(this, "smartcom_ordersucceeded", "одрдер доставлен на сервер котировок. № заявки (cookie): " + cookie + ". № заявки (order_id): " + order_id , 2);
           
       }
подвязка события:
C#
1
 smartcom.OrderSucceeded +=new _IStClient_OrderSucceededEventHandler(smartcom_ordersucceeded); // событие возникающее при успешном выставлении приказа на биржу
подскажите, как сделать так, что бы код приостановился и ждал наступления события smartcom_ordersucceeded?

борис
0
 Аватар для mikhail_g
192 / 147 / 27
Регистрация: 02.05.2011
Сообщений: 467
03.09.2012, 13:05
http://msdn.microsoft.com/ru-r... event.aspx
C#
1
2
3
4
5
6
7
//Создайте где нибудь вот этот объект
static AutoResetEvent eventAReady;
 
//вот этот метод усыпит поток до тех пор, пока не будет
//вызван метод: eventAReady.Set();
eventAReady.WaitOne();
//и только теперь дополняем свойства
т.е. в месте, где надо дождаться исполнения события вы пишите

C#
1
2
3
4
5
6
7
8
9
//здест ждём исполнения события
eventAReady.WaitOne();
 
void smartcom_ordersucceeded(int cookie, string orderid) // событие, если приказ на биржу выставлен успешно
       {
           order_id = orderid;
           logging_trade.log_add(this, "smartcom_ordersucceeded", "одрдер доставлен на сервер котировок. № заявки (cookie): " + cookie + ". № заявки (order_id): " + order_id , 2);
            eventAReady.Set(); // просигналит о том, что событие произошло
       }
Добавлено через 33 секунды
Будет работать, только если событие обрабатывается а значение обновляется в РАЗНЫХ потоках. Иначе поток подвиснет
1
4 / 4 / 0
Регистрация: 21.04.2012
Сообщений: 132
03.09.2012, 21:44  [ТС]
2mikhail_g

Сделал, так как вы говорите - все заработало! ура! большое спасибо!
Завел дескриптор ожидания

C#
1
private static AutoResetEvent order_id_issued = new AutoResetEvent(false); // создали дескриптор ожидания с автоматическим сбросом. тоесть оно меняет свое состояние автоматически и так же, после наступления события, автоматически возвращается в исходное состояние
далее в событии, в котором приходит моя долгожданная переменная order_id указал:

C#
1
2
3
4
5
6
7
void smartcom_ordersucceeded(int cookie, string orderid) // событие, если приказ на биржу выставлен успешно
       {
           order_id = orderid;
           order_id_issued.Set();
           logging_trade.log_add(this, "smartcom_ordersucceeded", "одрдер доставлен на сервер котировок. № заявки (cookie): " + cookie + ". № заявки (order_id): " + order_id , 2);
 
       }
ну и в том месте, где нужно ждать, указал:
C#
1
order_id_issued.WaitOne(); // ожидаем переход состояния событя работает

теперь следующий вопрос: а, как тоже самое сделать, только ожидать необходимо изменения содержания массива? или лучше отдельной темой расписать?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
03.09.2012, 21:46
Цитата Сообщение от slinger Посмотреть сообщение
лучше отдельной темой расписать
.....
0
 Аватар для mikhail_g
192 / 147 / 27
Регистрация: 02.05.2011
Сообщений: 467
04.09.2012, 10:48
Суть проблемы не ясна. Если проблема в том, что нужно дождаться обновления элемента массива, то заведите не массив а коллекцию типа ObservableCollection, и подпишитесь на событие коллекции CollectionChanged. Это событие сигнал о том, что коллекция изменилась.
Если надо так же от сервера дождаться ответа, сделайте по аналогии с предыдущим решением
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.09.2012, 10:48
Помогаю со студенческими работами здесь

Как организовать выход из циклической графической программы в любой момент ее выполнения?
Есть простая программа: Uses crt, Graph; Var Driver, Mode: Integer; Color: Word; x,y: Integer; r:word; C:Char; Procedure...

Засечь время выполнения (в ms) определённого кода или части кода
Доброго времени суток всем. Хотелось бы поинтересоваться у знающих людей. Как можно засеч время выполнения(в ms) определённого кода...

Выход в любой момент выполнения программы
Всем привет! Надо сделать выход из программы написанной на Pascal в любой момент ее выполнения при нажатии на Esc Т.е. не важно...

Как приостановить работу стороннего приложения
Ребят СРОЧНО нужна помощь! Нужна заморозка и открытие какого либо Проэкта или Программы! Пожалуйста помогите! Зарание Благодарен! ...

Как приостановить работу основного потока?
Как приостановить работу основного потока? Проблема в том что заполнение динамического массива происходит из разных потоков,а при этом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru