none
Таймер RRS feed

  • Вопрос

  • Нужно чтобы значение переменной увеличивалось на 1, каждую минуту..

    Почему когда делаю так :

    while

     

    (true)

    {

     

    Thread.Sleep(60000);

    x++;

    }

    приложение виснет?

     

     

     

    • Перемещено SachinW 1 октября 2010 г. 21:32 MSDN Forums Consolidation (От:Начинающие разработчики)

Ответы

  • Ну почему сразу виснет. Она честно спит 60 секунд, а потом быстро-быстро инкрементирует X и снова спит 60 сек и тд...

    Чтобы она "не висла" нужно выполнять отсчет 60ти секунд в другом потоке, тогда основной не будет блокироваться .

    Примерно это выглядит так:

          Thread t = new Thread(delegate()
            {
              while(true)
              {
                Thread.Sleep(10000);
                this.Invoke(new MethodInvoker(delegate() { this.x++; }));
              }          
            });
          t.Start();

    • Помечено в качестве ответа I.Vorontsov 19 мая 2010 г. 11:13
    Модератор
  • System.Windows.Forms

    Тут неплохая статья о потоках

     

    • Помечено в качестве ответа CheeGer 19 мая 2010 г. 13:08
    Модератор

Все ответы

  • Ну почему сразу виснет. Она честно спит 60 секунд, а потом быстро-быстро инкрементирует X и снова спит 60 сек и тд...

    Чтобы она "не висла" нужно выполнять отсчет 60ти секунд в другом потоке, тогда основной не будет блокироваться .

    Примерно это выглядит так:

          Thread t = new Thread(delegate()
            {
              while(true)
              {
                Thread.Sleep(10000);
                this.Invoke(new MethodInvoker(delegate() { this.x++; }));
              }          
            });
          t.Start();

    • Помечено в качестве ответа I.Vorontsov 19 мая 2010 г. 11:13
    Модератор
  • Спасибо..вот только у мя VS на метод Invoke ругется.. он из какой сборки?

     и где про него почитать можно? 

  • System.Windows.Forms

    Тут неплохая статья о потоках

     

    • Помечено в качестве ответа CheeGer 19 мая 2010 г. 13:08
    Модератор
  • Спасибо огромное.. пойду потоки зубрить...

  • можешь не инкрементировать и ждать каждую минуту, кстати.

    можно так же сделать чуть по другому, может такой вариант:

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

  • Как можно получить разность двух переменых DateTime в минутах?
    2 июня 2010 г. 10:32
  • смотри стандартные API функции. там можно указать формат возвращаемого значения. можно получать как символьную строку, а можно как числовое значение. а можно строковое преобразовать в числовое, или наоборот. как тебе захочется.

    в плюсах не помню, но тоже есть схожая функция.

    т нужно смотреть, что функция возвращает.

    например, если функция возвращает значение типа ччммсс, то разность в минутах можно вычислить как:

    объявляем переменную Х,У например типа int;

    получить в Х значение времени;

    Х сдвинуть вправо на 2*sizeof(int);  //отбросили секунды


    далее получаем значение времени в У;

    сдвигаем У вправо на 2*sizeof(int); //отбросили секунды

    Х-=У //находим разность;

    У=Х;

    сдвигаем У вправо на 2*sizeof(int); //отбросили минуты в У

    У*=60; // получили разницу чч в минутах

    Х+=У; // прибавили к разнице минут разницу чч в минутах

    всё. надеюсь я правильно понял, что ты хотел?

    стандартные функции смотри тут

    http://msdn.microsoft.com/en-us/library/dd318130(VS.85).aspx

    сишные - в справке компилятора

    3 июня 2010 г. 14:56
  • порылся немного, есть еще более простой вариант код будет чем-то таким:

    #include <windows.h>
    
    void main()
    
    {
    
    int x,y; \\объявили переменные
    
    SYSTEMTIME st; \\структура времени в виндовс
    
    GetSystemTime(&st); \\заполнили структуру стандартной ф-цией 

    x = st.wHour*60 + st.wMinute; \\посчиталь в икс минуты, с учетом 60 минут в часе GetSystemTime(&st); \\повторно заполнили структуру стандартной ф-цией y = st.wHour*60 + st.wMinute; \\получили в игрек минуты, с учетом 60 минут в часе x-=y; \\ нашли разность минут }

    если нужна проверка, прошла минута или нет, то хватит

    #include <windows.h> 
    void main() 
    {
     int x,y; \\объявили переменные 
    SYSTEMTIME st; \\структура времени в виндовс 
    GetSystemTime(&st); \\заполнили структуру стандартной ф-цией 
    x = st.wMinute; \\посчиталь в икс минуты
     GetSystemTime(&st); \\повторно заполнили структуру стандартной ф-цией 
    y = st.wMinute; \\получили в игрек минуты 
    x-=y; \\ нашли разность минут if (x>=1) { ; // твое действие } }

     

    что-то типо этого

    для экономии можно вместо игрека делать так: x-= st.wMinute;
    3 июня 2010 г. 15:20