Чем заменить оператор while(true)

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
forex2030
337
forex2030  

Проблема в том что когда работает бесконечный цикл проверки  while(true), то некоторые кнопки на торговой панели не нажимаются
(игнорируются кнопки закрытия позиций или кнопка свернуть панель),
а если убрать оператор  while(true), то панель моргает бесконечно

Чем можно заменить этот оператор чтобы и не моргало и кнопки нажимались?

void Panel(){
   while (true && !IsStopped()){
      RefreshRates();
      if (IsConnected()) TradePanel();
      if (!IsConnected()) ObjectTradePanel();
      WindowRedraw();
      Sleep(200);}}
Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
Sergey Kolemanov
1018
Sergey Kolemanov  
forex2030:

Проблема в том что когда работает бесконечный цикл проверки  while(true), то некоторые кнопки на торговой панели не нажимаются
(игнорируются кнопки закрытия позиций или кнопка свернуть панель),
а если убрать оператор  while(true), то панель моргает бесконечно

Чем можно заменить этот оператор чтобы и не моргало и кнопки нажимались?

Покажите полностью код, т.к. не понятно где Вы его вызываете. Есть подозрение что логика написана неправильно, но не видя кода это гадание на кофейной гуще.

forex2030
337
forex2030  
Sergey Kolemanov:

Покажите полностью код, т.к. не понятно где Вы его вызываете. Есть подозрение что логика написана неправильно, но не видя кода это гадание на кофейной гуще.

Код большой 4000 строк, нет смысла его выкладывать, голова взорвётся.
Сам оператор при постоянном цикле не даёт моргать панели и так же не даёт некоторым функциям реагировать на нажатие, его надо чем-то заменить.
Panel() вызывается в OnInit(), OnTimer(), OnTick()

Evgeniy Zhdan
16901
Evgeniy Zhdan  
forex2030:

Проблема в том что когда работает бесконечный цикл проверки  while(true), то некоторые кнопки на торговой панели не нажимаются
(игнорируются кнопки закрытия позиций или кнопка свернуть панель),
а если убрать оператор  while(true), то панель моргает бесконечно

Чем можно заменить этот оператор чтобы и не моргало и кнопки нажимались?

Все верно. пока цикл крутится, ничего работать не будет. Многопоточность? Не, не слышали

Ihor Herasko
21868
Ihor Herasko  
Пользуйтесь событиями (Timer, ChartEvent), а не бесконечными циклами.
SeriousRacoon
1124
SeriousRacoon  
forex2030:

Код большой 4000 строк, нет смысла его выкладывать, голова взорвётся.
Сам оператор при постоянном цикле не даёт моргать панели и так же не даёт некоторым функциям реагировать на нажатие, его надо чем-то заменить.
Panel() вызывается в OnInit(), OnTimer(), OnTick()

Если эта шляпа вызывается в oninit, в других она вызываться уже просто не будет, т.к. из oninit никогда не выйдет.
forex2030
337
forex2030  
Ihor Herasko:
Пользуйтесь событиями (Timer, ChartEvent), а не бесконечными циклами.

Не помогает, без while(true) всё моргает, а с этим оператором всё чистенько работает без лагов.

Ihor Herasko
21868
Ihor Herasko  
forex2030:

Не помогает, без while(true) всё моргает, а с этим оператором всё чистенько работает без лагов.

Мерцает из-за того, что удаляете объекты и отображаете их заново. Объект нужно один раз создать и потом только обновлять его состояние. Если уж удаляется объект, то по крайней мере до следующего тика, а не с тем, чтобы тут же его заново отобразить.

Алексей Тарабанов
10042
Алексей Тарабанов  
forex2030:

Не помогает, без while(true) всё моргает, а с этим оператором всё чистенько работает без лагов.

Чистенько работает, потому, что не работает, а гонит бесконечный цикл без пауз. Всё стоит, оттого и чистенько. 

Сделайте паузу в конце цикла - этой паузой воспользуются асинхронные операции и программа оживёт. 

Маленькая пауза - будет моргать экран, большая - снизится эффективность циклических операций. Ищите оптимальную. 

Ну и минимизировать операции перерисовки, здесь я полностью согласен с Игорем. 

Алексей Тарабанов
10042
Алексей Тарабанов  

Кстати, полный аналог Вашего кода: 

void Panel(){
   while ( !IsStopped()){               // Цикл, пока нет команды отмены
      RefreshRates();                   // Обновить котировки
      if (IsConnected()) TradePanel()   // Если есть соединение с сервером, то TradePanel
      else ObjectTradePanel();          // Если соединения нет, то ObjectTradePanel
      WindowRedraw();                   // Обновить экран
      Sleep(200);}}                     // Пауза 200 мс

Нет желания показать два вызываемых модуля? 

Алексей Тарабанов
10042
Алексей Тарабанов  
forex2030:

Код большой 4000 строк, нет смысла его выкладывать, голова взорвётся.
Сам оператор при постоянном цикле не даёт моргать панели и так же не даёт некоторым функциям реагировать на нажатие, его надо чем-то заменить.
Panel() вызывается в OnInit(), OnTimer(), OnTick()

В OnInit закрывать позицию некошерно. 

Да и в Panel у Вас только проверка на соединение с сервером. 2-3 логические ошибки могут легко разрушить код из 4000 операторов. 

123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий