Считать 3 секунды в функции - PullRequest
1 голос
/ 10 февраля 2012

В моей программе есть событие, в котором значения tantheta продолжают изменяться при последующих событиях.

Проблема заключается в том, что мне нужно проверить, находится ли это значение tantheta в пределахопределенный диапазон 0.6 to 1.5 в течение 3 секунд.

Я пробовал некоторые вещи с таймером, но не получилось.Любые предложения?

РЕДАКТИРОВАТЬ -

DispatcherTimer timer = new System.Windows.Threading.DispatcherTimer();
//This event is fired automatically 32 times per second.
private void SomeEvemt(object sender, RoutedEventArgs e)
{
tantheta = ; tantheta gets a new value here through some calculation

timer.Tick += new EventHandler(timer_Tick);
timer.Interval = new TimeSpan(0, 0, 5);
timer.Start();
//if condition to check if tantheta is within range and do something

}

void timer_Tick(object sender, EventArgs e)
        {
            DispatcherTimer thisTimer = (DispatcherTimer)sender;
            textBox1.Text = thisTimer.Interval.ToString();
            thisTimer.Stop();
            return;
        }

Я должен проверить, остается ли значение тантеты в пределах от 0,6 до 1 в течение трех секунд.Я думаю, что таймер будет хорошим подходом, так как он предотвратит зависание моего приложения во время всех этих вычислений, потому что оно идет в отдельный поток.: - /

Ответы [ 2 ]

2 голосов
/ 10 февраля 2012

Таймер бесполезен, потому что вы будете опрашивать слишком много раз и пропустите изменение / возврат обратно.

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

class A
{
    private double _tantheta; // add public getter
    private bool _checkBoundaries; // add public getter/setter
    public event EventHandler TanThetaWentOutOfBounds;
    public void SetTantheta(double newValue)
    {
        if(_checkBoundaries &&
            (newValue < 0.6 || newValue > 1.5))
        {
            var t = TanThetaWentOutOfBounds;
            if(t != null)
            {
                t(this, EventArgs.Empty);
            }
        }
        else
        {
            _tantheta = newValue;  
        }
    }

Теперь все, что вам нужно сделать, это подписаться на событие TanThetaWentOutOfBounds этого класса и установить для CheckBoundaries значение true или false.

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

Существует три способа обработки трехсекундных периодов:

  1. В обработчике TanThetaWentOutOfBounds (некотором другом классе, который регистрируется для события) отслеживают время предыдущего обновления и принимают меры только тогда, когда событие возникает в течение 3 секунд с начала измерения. Таким образом, ответственность за реализацию периода возлагается на потребителя.

  2. Вы можете решить поднять событие, только если прошло менее 3 секунд с момента предыдущего события. Таким образом, вы ограничиваете всех потребителей тем периодом, который вы используете в рейзере. Обратите внимание, что я использовал DateTime.Now, чтобы получить время, это не так точно, как класс секундомера.

Код:

class A
{
    private double _tantheta; // add public getter
    private DateTime _lastRaise = DateTime.MinValue;
    private bool _checkBoundaries; // add public getter/setter
    public event EventHandler TanThetaWentOutOfBounds;
    public void SetTantheta(double newValue)
    {
        if(_checkBoundaries &&
            (newValue < 0.6 || newValue > 1.5))
        {
            var t = TanThetaWentOutOfBounds;
            if(t != null)
            {
                var now = DateTime.Now;
                if((now - _lastRaise).TotalSeconds < 3)
                {
                    t(this, EventArgs.Empty);
                    _lastRaise = now;
                }
            }
        }
        else
        {
            _tantheta = newValue;  
        }
    }
0 голосов
/ 10 февраля 2012

Я предполагаю, что вам нужна переменная вне функции, которая отслеживает последний раз, когда функция была вызвана.Таким образом, вы можете проверить, прошло ли 3 секунды с момента последнего вызова.Нет необходимости в объекте Timer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...