C# i timer

  • 7 Odpowiedzi
  • 5828 Wyświetleń

0 użytkowników i 1 Gość przegląda ten wątek.

*

Offline biela

  • 28
    • http://www.biela.prv.pl
C# i timer
« dnia: Maj 22, 2005, 16:05:16 »
Witam
Ma ktos jakis przykladowy licznik czasu na PPC w C#.NET ? Nie wiem co jest grane ale nie moge sie dobrac do timer.Start() i timer.Stop(). Nie ma tych metod. Natomiast normalnie przy pisaniu zwyklej aplikacji sa dostepne.

*

Offline RMK

  • **
  • 157
    • http://przemelek.blogspot.com
  • Sprzęt: ASUS A636N
C# i timer
« Odpowiedź #1 dnia: Maj 22, 2005, 16:29:08 »
Nie wiem czy timery maja metody Start() i Stop()...
ale jezeli chcesz wykorzystac timery to robimy to tak:

Timer timer = new Timer();
timer.Interval=1000; // 1000 ms
timer.Enabled=true; // wlaczony
timer.Enabled=false; // wylaczony

timer.Tick+=new EventHandler(On_Timer); // dodajemy metode On_Timer, ktora bedzie wywolana po wyekscytowaniu ;) timera.

A metode On_Timer deklarujemy tak:

      private void On_Timer(object unused,EventArgs notused)
      {

      }

*

Offline biela

  • 28
    • http://www.biela.prv.pl
C# i timer
« Odpowiedź #2 dnia: Maj 22, 2005, 19:30:43 »
A jakbym chcial czas w ms mierzyc to podaje
timer.Interval=1; ??

Jak sie spozniej dobrac do licznika czasu ile juz uplynelo od true do false ??

*

Offline RMK

  • **
  • 157
    • http://przemelek.blogspot.com
  • Sprzęt: ASUS A636N
C# i timer
« Odpowiedź #3 dnia: Maj 22, 2005, 19:55:48 »
Cytat: biela
A jakbym chcial czas w ms mierzyc to podaje
timer.Interval=1; ??

Zeby mierzyc to nie uzywasz timerow, a gdybys chcial miec wyzwalanie co milisekunde to wtedy radze odstawic na bok WinAPI i uzywac specjalizowanych bibliotek, na duzych Windowsach uzywa sie chyba czegos z DirectX.
Mozna tez sprobowac odpalic watek, w ktorym bedziesz pobieral w petli czas w ms i sprawdzal czy zmienil sie od ostatniego razu, ale po pierwsze, nie ma gwarancji, ze dostaniesz taka rozdzielczosc [raczej napewno nie dostaniesz ;)], po drugie zajedziesz w taki sposob procesor bo taki watek bedzie zzeral caly czas procesora.

Napisz dokladniej do czego potrzebujesz tych timerow, bo nie wiem czy probojesz ich uzywac do odpalania co jakis czas metody, czy raczej do mierzenia czasu.

Cytat: biela
Jak sie spozniej dobrac do licznika czasu ile juz uplynelo od true do false ??

Z tego co pamietam to nie mozna sie dobrac, ale wystarczy sobie wtedy zapisywac gdzies czas odpalenia timera i mozna przez proste odejmowanie policzyc czas.
Milo jest uzywac getTickCount() czyli czasu w milisekundach chyba od poczatku uruchomienia systemu. Napewno jest to pod Win32, wiec i w WinAPI PocketPC powinno byc. Jak sie do tych rzeczy dorwac z C# mozna znalezc na CodeProject http://www.codeproject.com/csharp/highperformancetimercshar.asp

*

Offline biela

  • 28
    • http://www.biela.prv.pl
C# i timer
« Odpowiedź #4 dnia: Maj 22, 2005, 20:06:32 »
Cytat: RMK
Napisz dokladniej do czego potrzebujesz tych timerow, bo nie wiem czy probojesz ich uzywac do odpalania co jakis czas metody, czy raczej do mierzenia czasu.
Do mierzenia czasu. Generalnie mam grupe zapytan SQL do bazy i chce zmierzyc czas ich wykonania. I miloby bylo gdyby wyniki byly wlasnie razem z podawanymi milisekundami. Narazie robie to w ten sposob:

startTime = DateTime.Now;

:
:
: tu sie wykonuja zapytania
:
:

System.TimeSpan diff = DateTime.Now.Subtract(startTime);

label1.Text = diff.Seconds.ToString() +" sec. "
+ diff.Milliseconds.ToString()+ "mills.";


Tylko, że tą metodą nigdy nie dostaje zwróconych milisekund i nie wiem czemu :(. Sekundy mi wyświetla ok.

*

Offline RMK

  • **
  • 157
    • http://przemelek.blogspot.com
  • Sprzęt: ASUS A636N
C# i timer
« Odpowiedź #5 dnia: Maj 22, 2005, 20:23:43 »
OK, mielismy maly problem terminologiczny ;)
Osobiscie powiem, ze ten Twoj sposob mi sie nie podoba, ale kwestia gustu ;)
Ja zrobilbym to tak:
long start = DateTime.Now.Ticks;
czynnosci
long czas = DateTime.Now.Ticks-start;
czas/=10000;

wynik coby byl w milisekundach trzeba chyba podzielic przez 10 tysiecy, bo 1 tick to 100 nanosekund, jezeli chcesz miec tez ilosc sekund to mozna jeszcze dodac na koncu:
double czasD=czas/1000.0;


[Dodano: 2005-05-22 20:27:19]
Jest jeszcze:
Environment.TickCount

ktore zwraca czas w milisekundach od startu systemu [czyli to wlasnie getTickCount() :)]

*

Offline biela

  • 28
    • http://www.biela.prv.pl
C# i timer
« Odpowiedź #6 dnia: Maj 22, 2005, 22:51:23 »
Cytat: RMK
Osobiscie powiem, ze ten Twoj sposob mi sie nie podoba, ale kwestia gustu ;)
To nie moj tylko taki wynalazłem ;)
Cytat: RMK
Jest jeszcze:
Environment.TickCount

ktore zwraca czas w milisekundach od startu systemu [czyli to wlasnie getTickCount() :)]

Zastosowałem to i w aplikacji windows ładnie śmiga ale na PPC nie działa :(. Może bys mial ochote sie troche pobawic :) ? Ponizej kod do aplikacji windows.



using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace timer2
{
   /// <summary>
   /// Summary description for Form1.
   /// </summary>
   public class Form1 : System.Windows.Forms.Form
   {
      private System.Windows.Forms.Label label1;
      private System.Windows.Forms.Label label2;
      private System.Windows.Forms.Timer timer1;
      private System.ComponentModel.IContainer components;
      private System.Windows.Forms.Button button1;
private System.Int32 CompTime;
      public Form1()
      {
         //
         // Required for Windows Form Designer support
         //
         InitializeComponent();

         //
         // TODO: Add any constructor code after InitializeComponent call
         //
      }

      /// <summary>
      /// Clean up any resources being used.
      /// </summary>
      protected override void Dispose( bool disposing )
      {
         if( disposing )
         {
            if (components != null)
            {
               components.Dispose();
            }
         }
         base.Dispose( disposing );
      }

      #region Windows Form Designer generated code
      /// <summary>
      /// Required method for Designer support - do not modify
      /// the contents of this method with the code editor.
      /// </summary>
      private void InitializeComponent()
      {
         this.components = new System.ComponentModel.Container();
         this.label1 = new System.Windows.Forms.Label();
         this.label2 = new System.Windows.Forms.Label();
         this.timer1 = new System.Windows.Forms.Timer(this.components);
         this.button1 = new System.Windows.Forms.Button();
         this.SuspendLayout();
         //
         // label1
         //
         this.label1.Location = new System.Drawing.Point(16, 24);
         this.label1.Name = "label1";
         this.label1.Size = new System.Drawing.Size(504, 23);
         this.label1.TabIndex = 0;
         //
         // label2
         //
         this.label2.Location = new System.Drawing.Point(16, 64);
         this.label2.Name = "label2";
         this.label2.Size = new System.Drawing.Size(504, 23);
         this.label2.TabIndex = 1;
         //
         // timer1
         //
         this.timer1.Enabled = true;
         this.timer1.Interval = 20;
         this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
         //
         // button1
         //
         this.button1.Location = new System.Drawing.Point(232, 112);
         this.button1.Name = "button1";
         this.button1.TabIndex = 2;
         this.button1.Text = "Start";
         this.button1.Click += new System.EventHandler(this.button1_Click);
         //
         // Form1
         //
         this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
         this.ClientSize = new System.Drawing.Size(536, 157);
         this.Controls.Add(this.button1);
         this.Controls.Add(this.label2);
         this.Controls.Add(this.label1);
         this.Name = "Form1";
         this.Text = "Timer";
         this.Load += new System.EventHandler(this.Form1_Load);
         this.ResumeLayout(false);

      }
      #endregion

      /// <summary>
      /// The main entry point for the application.
      /// </summary>
      [STAThread]
      static void Main()
      {
         Application.Run(new Form1());
      }

      private void Form1_Load(object sender, System.EventArgs e)
      {
         
      }

      private void timer1_Tick(object sender, System.EventArgs e)
      {
         long CurTickValue = Environment.TickCount;
         long Difference = CurTickValue - CompTime;
         
         long ComputerHours, ComputerMinutes, ComputerSeconds;
         long ApplicationHours, ApplicationMinutes, ApplicationSeconds, Appset;

         ComputerHours = (CurTickValue / (3600 * 999)) % 24;
         ComputerMinutes = (CurTickValue / (60 * 999)) % 60;
         ComputerSeconds = (CurTickValue / 999) % 60;
         
         ApplicationHours = (Difference / (3600 * 999)) % 24;
         ApplicationMinutes = (Difference / (60 * 999)) % 60;
         ApplicationSeconds = (Difference / 999) % 60;
         Appset = (Difference /  999) % 60;

         label1.Text = String.Format("This computer has been ON for {0} hours, {1} minutes {2} seconds {3} milliseconds",
            ComputerHours.ToString(),
            ComputerMinutes.ToString(),
            ComputerSeconds.ToString(),
            CurTickValue.ToString() );

         label2.Text = String.Format("This application has been running for {0} hours, {1} minutes {2} seconds {3} milliseconds",
            ApplicationHours.ToString(),
            ApplicationMinutes.ToString(),
            ApplicationSeconds.ToString(),
            Difference.ToString() );}

      private void button1_Click(object sender, System.EventArgs e)
      {
         CompTime = Environment.TickCount;
      }
   }
}


*

Offline biela

  • 28
    • http://www.biela.prv.pl
C# i timer
« Odpowiedź #7 dnia: Maj 23, 2005, 10:09:27 »
Wiem w czym problem lezy, ten timer1_Tick nie chce wyswietlac rzeczywistego czasu w labelach, ale jak wyciagam konkretna stala wartosc czasu to jest ok, a to mi wsytarczy :). Dzieki za pomoc.