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

 

Проблема в том что когда работает бесконечный цикл проверки  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
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
forex2030:

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

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

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

 
Sergey Kolemanov:

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

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

 
forex2030:

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

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

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

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

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

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

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

 
forex2030:

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

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

 
forex2030:

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

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

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

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

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

 

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

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

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

 
forex2030:

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

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

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

Причина обращения: