Как заблокировать таймер при обработке прошедшего события?

Вам просто нужно запустить собственный 1-строчный здесь, чтобы объединить time объекты в timedelta объекты, которые затем могут быть суммированы вместе. (см. строку «печать»)

from datetime import datetime, timedelta
import pandas as pd

phone = PhoneRecord.objects.all()
df = pd.DataFrame(list([i.__dict__ for i in phone])) # create pd.df from model query
df.et = df.et.fillna('00:00:00')  # some records are blank
print(df.et)
print("SUM:", sum([datetime.combine(datetime.min, time) - datetime.min for time in df.et.tolist()], timedelta()))

Вы должны получить что-то вроде этого:

0    00:00:20
1    00:00:20
2    00:00:50
3    00:00:30
4    00:00:20

SUM: 0:02:20

Мне пришлось немного изменить вещи, чтобы заставить их работать на моем конце, так что, надеюсь, То же самое относится и к вам, и к вашей версии Панд и Джанго. Надеюсь, это поможет!

14
задан Michael Hedgpeth 2 May 2009 в 16:10
поделиться

5 ответов

You could set AutoReset to false, then explicitly reset the timer after you are done handling it. Of course, how you handle it really depends on how you expect the timer to operate. Doing it this way would allow your timer to drift away from the actual specified interval (as would stopping and restarting). Your mechanism would allow each interval to fire and be handled but it may result in a backlog of unhandled events that are handled now where near the expiration of the timer that cause the handler to be invoked.

timer.Interval = TimeSpan.FromSeconds(5).TotalMilliseconds;
timer.Elapsed += Timer_OnElapsed;
timer.AutoReset = false;
timer.Start();


public void Timer_OnElapsed(object sender, ElapsedEventArgs e)
{
    if (!found)
    {
      found = LookForItWhichMightTakeALongTime();
    }
    timer.Start();
}
15
ответ дан 1 December 2019 в 12:13
поделиться

Если LookForItWhichMightTakeALongTime () займет много времени, я бы предложил не использовать System.Windows.Forms.Timer , потому что при этом заблокирует ваш поток пользовательского интерфейса, и пользователь может убить ваше приложение, думая, что оно заморожено.

Вы можете использовать BackgroundWorker (вместе с таймером , если это необходимо) .

public class MyForm : Form
{
  private BackgroundWorker backgroundWorker = new BackgroundWorker();

  public MyForm()
  {
    InitializeComponents();
    backgroundWorker.DoWork += backgroundWorker_DoWork;
    backgroundWorker.RunWorkerCompleted +=
                                backgroundWorker_RunWorkerCompleted;
    backgroundWorker.RunWorkerAsync();
  }

  private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
  {
    e.Result = LookForItWhichMightTakeALongTime();
  }

  private void backgroundWorker_RunWorkerCompleted(object sender,
                                             RunWorkerCompletedEventArgs e)
  {
    found = e.Result as MyClass;
  }
}

И вы можете вызывать RunWorkerAsync () из любого места, где вы хотите, даже из Timer , если хотите. И просто убедитесь, что BackgroundWorker уже запущен с момента вызова RunWorkerAsync () , когда он работает, выдаст исключение.

private void timer_Tick(object sender, EventArgs e)
{
  if (!backgroundWorker.IsBusy)
    backgroundWorker.RunWorkerAsync();
}
1
ответ дан 1 December 2019 в 12:13
поделиться
timer.enabled = false

или

timer.stop();

и

timer.enabled = true

или

timer.start();
0
ответ дан 1 December 2019 в 12:13
поделиться

Я обычно останавливаю таймер во время его обработки, вводю блок try / finally и возобновляю таймер после завершения.

9
ответ дан 1 December 2019 в 12:13
поделиться

Я использую System.Threading.Timer примерно так

 class Class1
    {
        static Timer timer = new Timer(DoSomething,null,TimeSpan.FromMinutes(1),TimeSpan.FromMinutes(1));

        private static void DoSomething(object state)
        {
            timer = null; // stop timer

            // do some long stuff here

            timer = new Timer(DoSomething, null, TimeSpan.FromMinutes(1), TimeSpan.FromMinutes(1));
        }



    }
-1
ответ дан 1 December 2019 в 12:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: