Ошибки, баги, вопросы - страница 3561

 
Andrey Dik #:
for и while (while  с большей вероятностью). Если загрузка процессора близка к 100%

циклы сами по себе могут сделать нагрузку близкую к 100%.. например пустой цикл :-)

просто не надо цикле опрашивать состояние, оно не поменяется. Если в советнике есть "while не_пришёл_следующий_тик {...}"  то вы делаете что-то не то и не так

 
Maxim Kuznetsov #:

циклы сами по себе могут сделать нагрузку близкую к 100%.. например пустой цикл :-)

просто не надо цикле опрашивать состояние, оно не поменяется. Если в советнике есть "while не_пришёл_следующий_тик {...}"  то вы делаете что-то не то и не так

Нет, проблема выявлена в утилите, которая никак не обрабатывает цены и не запрашивает их. while прекрасно отрабатывает когда процессор не загружен полностью, но когда загружен - полный ступор, зависание утилиты. Есть ощущение, что исполнительная среда терминала на чарте приостанавливает работу программы. Я просто поделился наблюдением, кому-то, возможно, это будет полезным принять к сведению.
 
Maxim Kuznetsov #:

циклы сами по себе могут сделать нагрузку близкую к 100%.. например пустой цикл :-)

просто не надо цикле опрашивать состояние, оно не поменяется. Если в советнике есть "while не_пришёл_следующий_тик {...}"  то вы делаете что-то не то и не так

Вот неправильные пчёлы:


А вот правильные:


 
Artyom Trishkin #:

Вот неправильные пчёлы:


А вот правильные:


когда ваши "правильные пчёлы" будут не в OnStart() а в OnTick() то принесут они отнюдь не мёд ;-) 

будет ситуация близкая к описываемой Андреем, всё встанет колом. 

не надо в событийно управляемом софте ( в советнике, где всё на обработчиках OnXXX ) делать циклы ожидания событий. 

 
Maxim Kuznetsov #:

когда ваши "правильные пчёлы" будут не в OnStart() а в OnTick() то принесут они отнюдь не мёд ;-) 

будет ситуация близкая к описываемой Андреем, всё встанет колом. 

не надо в событийно управляемом софте ( в советнике, где всё на обработчиках OnXXX ) делать циклы ожидания событий. 

А зачем делать в OnTick() зацикленные вещи? Что Вы мне прописные истины рассказываете?

 
Maxim Kuznetsov #:

не надо в событийно управляемом софте ( в советнике, где всё на обработчиках OnXXX ) делать циклы ожидания событий. 

При работе с событиями - да, всё верно и понятно. Но проблема может возникнуть там, где её совсем не ожидаешь, например, в каких нибудь математических расчётах (в том же алглиб активно и повсеместно используются while).

 
Artyom Trishkin #:

А зачем делать в OnTick() зацикленные вещи? Что Вы мне прописные истины рассказываете?

это ты начал сыпать прописью про пчёл и разгрузку длинных циклов переключением контекста (слипом)..там кстати можно было обойтись https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-switchtothread

SwitchToThread function (processthreadsapi.h) - Win32 apps
SwitchToThread function (processthreadsapi.h) - Win32 apps
  • 2024.02.22
  • karl-bridge-microsoft
  • learn.microsoft.com
Causes the calling thread to yield execution to another thread that is ready to run on the current processor. The operating system selects the next thread to be executed.
 
Andrey Dik #:

При работе с событиями - да, всё верно и понятно. Но проблема может возникнуть там, где её совсем не ожидаешь, например, в каких нибудь математических расчётах (в том же алглиб активно и повсеместно используются while).

с нехорошими фризами сталкивался когда баловался с канвасом. Полноэкранный Canvas вполне втормозит весь терминал. Если ещё и RDP то гарантированно

Может CUDA подвести, считать на видяхе это быстро и удобно, но она одна. 

 
Зачем спорить о очевидных вещах?
В руках ламера любой цикл может подвесить систему.
В руках опытного разработчика никакой цикл не подвесит систему, в том числе и с канвасом 8K
 
Maxim Kuznetsov #:

с нехорошими фризами сталкивался когда баловался с канвасом. Полноэкранный Canvas вполне втормозит весь терминал. Если ещё и RDP то гарантированно

Может CUDA подвести, считать на видяхе это быстро и удобно, но она одна. 

Нет, речь не о проблемном тяжёлом цикле (он не делает нагрузку на проц), а в том, что терминал блокирует выполнение программы в теле while тогда, когда проц сильно загружен другими процессами, например, агентами при оптимизации. Если нет других нагрузок на проц, то программа с while не зависает и даже не оказывает существенной нагрузки на процессор. Возможно дело в том, что терминал это делает специально, что бы гарантировать свою собственную (терминала) бесперебойную работу.

Т.е., проблема программы с while может проявляться когда процессор загружен другими процессами. Частично помогает рукопашное повышение приоритета процессу терминала. Ещё помогает оставление хотя бы одного агента невключенным.