А почему б GSTrackSearch не использовать? Длину вагона можно ж получить.
А почему б GSTrackSearch не использовать? Длину вагона можно ж получить.
Хм... Надо попробовать. Правда когда делал "Движение в депо", мне показалось, что GetLenght() не всегда возвращает точную длину вагона. Возможно просто показалось.
А известны причины, по которым вылетает ошибка ER_Timeout? Как от неё оптимизироваться?
Nemo, слишком долго твой скрипт занимает процессорное время. Как следствие, ТРС считает, что твой скрипт завис. Надо переодически делать небольшие паузы через Sleep. Хотя бы на 0.01 секунды. Скажем, если у тебя масив, то на каждые 1000 элементов один Sleep(0.01)
Как можно сделать таймер, работающий, пока выполняется условие?
То есть смысл такой:
Выполнилось условие - таймер запустился, и работает, пока условие выполняется.
Если условие перестало выполняться - таймер сбросился.
Если таймер успел дотикать до нужного времени - выполнилось второе условие.
World.GetSeconds() — счетчик секунд, не останавливается во время пауз.
World.GetTimeElapsed() — то же, останавливается во время пауз.
Если условие выполнилось, запоминаешь секунды где-нибудь, периодически проверяешь разность текущего и сохраненного, если больше нужного времени — выполнилось действие.
Ну да, я пробовал что-то подобное. Но интересует вот это подробней:
Как и с какой периодичностью проверяется? Я пробовал это всё update-е осуществить.периодически проверяешь разность текущего и сохраненного
Лучшим примером послужит кусок кода.
Нужную периодичность ты лучше знаешь, зависит от того, что ты мониторишь.Код:thread void Monitor() { float checkInterval = %some_time%; float timerTime = %some_another_time%; bool conditionState = false; float conditionStartTime; while (true) { bool condition = %condition%; float time = World.GetTimeElapsed(); if (condition and !conditionState) { conditionState = true; conditionStartTime = time } if (!condition and conditionState) { conditionState = false; %do_second%(); } if (conditionState) { float condTime = time - conditionStartTime; if (condTime > timerTime) { %do_first%(); } } } }
По-моему checkinterval нигде не используется. Так и надо?
Однако не работает :/
В общем мне нужно сделать отказ локомотива при езде на реостатной позиции
Выглядит это так:
СоответственноКод:thread void hod_position_check() { float checkInterval = 1.0; float timerTime = 25.0; bool conditionState = false; float conditionStartTime; while(true) { float time1 = World.GetTimeElapsed(); if(!hod_pos and !conditionState) { conditionState = true; conditionStartTime = time1; } if (hod_pos and conditionState) { conditionState = false; } if (conditionState) { float failtime = time1 - conditionStartTime; if(failtime > timerTime) { locofail = true; } } } }
hod_pos - условие ходовой позиции
locofail - условие поломки
Интервал 1 секунда(он же в секундах измеряется?)
таймер 25 секунд(ну просто для проверки)
Запускается тред при наборе реостатной позиции, то есть
if(!hod_pos)
{
hod_position_check();
}
При наборе реостатной позиции вся эта халабуда начинает жутко тормозить и выдавать эрроры "Thread Exception: ER_timeout, line 930"(в коде желтая строка).
Что я делаю не так?