Как Вы добавляете таймер к консольному приложению C#

В вашем регулярном выражении содержится только одна пара круглых скобок (одна группа захвата), поэтому вы получаете только одну группу в своем матче. Если вы используете оператор повторения в группе захвата (+ или *), группа получает «перезаписывается» каждый раз, когда группа повторяется, что означает, что только последнее совпадение зафиксировано.

В ваш пример здесь, вам, вероятно, лучше использовать .split() в сочетании с регулярным выражением:

lun_q = 'Lun:\s*(\d+(?:\s+\d+)*)'
s = '''Lun: 0 1 2 3 295 296 297 298'''

r = re.search(lun_q, s)

if r:
    luns = r.group(1).split()

    # optionally, also convert luns from strings to integers
    luns = [int(lun) for lun in luns]
126
задан Johan Bresler 25 November 2008 в 14:04
поделиться

3 ответа

Используйте Систему. Поточная обработка. Класс таймера.

Система. Windows. Формы. Таймер разрабатывается, прежде всего, для использования в единственном потоке обычно поток UI Windows Forms.

существует также Система. Класс таймеров, добавленный вначале в разработке платформы.NET. Однако обычно рекомендуется использовать Систему. Поточная обработка. Класс таймера вместо этого, поскольку это - просто обертка вокруг Системы. Поточная обработка. Таймер так или иначе.

также рекомендуется всегда использовать помехи (совместно использованный в VB.NET) Система. Поточная обработка. Таймер, если Вы разрабатываете службу Windows и требуете, чтобы таймер периодически работал. Это избежит возможно преждевременной сборки "мусора" Вашего объекта - таймера.

Вот пример таймера в консольном приложении:

using System; 
using System.Threading; 
public static class Program 
{ 
    public static void Main() 
    { 
       Console.WriteLine("Main thread: starting a timer"); 
       Timer t = new Timer(ComputeBoundOp, 5, 0, 2000); 
       Console.WriteLine("Main thread: Doing other work here...");
       Thread.Sleep(10000); // Simulating other work (10 seconds)
       t.Dispose(); // Cancel the timer now
    }
    // This method's signature must match the TimerCallback delegate
    private static void ComputeBoundOp(Object state) 
    { 
       // This method is executed by a thread pool thread 
       Console.WriteLine("In ComputeBoundOp: state={0}", state); 
       Thread.Sleep(1000); // Simulates other work (1 second)
       // When this method returns, the thread goes back 
       // to the pool and waits for another task 
    }
}

Из книги CLR Через C# Jeff Richter. По тому, как эта книга описывает объяснение позади 3 типов таймеров в Главе 23, настоятельно рекомендованной.

65
ответ дан 24 November 2019 в 00:52
поделиться

Вот код для создания простого вторая галочка таймера:

  using System;
  using System.Threading;

  class TimerExample
  {
      static public void Tick(Object stateInfo)
      {
          Console.WriteLine("Tick: {0}", DateTime.Now.ToString("h:mm:ss"));
      }

      static void Main()
      {
          TimerCallback callback = new TimerCallback(Tick);

          Console.WriteLine("Creating timer: {0}\n", 
                             DateTime.Now.ToString("h:mm:ss"));

          // create a one second timer tick
          Timer stateTimer = new Timer(callback, null, 0, 1000);

          // loop here forever
          for (; ; )
          {
              // add a sleep for 100 mSec to reduce CPU usage
              Thread.Sleep(100);
          }
      }
  }

И вот получающийся вывод:

    c:\temp>timer.exe
    Creating timer: 5:22:40

    Tick: 5:22:40
    Tick: 5:22:41
    Tick: 5:22:42
    Tick: 5:22:43
    Tick: 5:22:44
    Tick: 5:22:45
    Tick: 5:22:46
    Tick: 5:22:47

РЕДАКТИРОВАНИЕ: Это никогда не хорошая идея добавить твердые циклы вращения в код, поскольку они используют циклы ЦП ни для какого усиления. В этом случае тот цикл был добавлен только, чтобы мешать приложению закрыться, позволив действиям потока наблюдаться. Но ради правильности и уменьшать использование ЦП простой вызов Сна был добавлен к тому циклу.

21
ответ дан 24 November 2019 в 00:52
поделиться

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

private void ThreadLoop(object callback)
{
    while(true)
    {
        ((Delegate) callback).DynamicInvoke(null);
        Thread.Sleep(5000);
    }
}

был бы Ваш поток синхронизации (измените это для остановки, когда reqiuired, и в любом временном интервале Вы хотите).

и использовать/начинать Вас может сделать:

Thread t = new Thread(new ParameterizedThreadStart(ThreadLoop));

t.Start((Action)CallBack);

Обратный вызов является Вашим пустым методом без параметров, который Вы хотите, зашел в каждый интервал. Например:

private void CallBack()
{
    //Do Something.
}
4
ответ дан 24 November 2019 в 00:52
поделиться
Другие вопросы по тегам:

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