|
Hello
statusStrip1.Items["Label Name"].Visible = true;
rasper wrote: Also how to access the label item with the help of EventArgs obbject?
What is your event handler??
Regards
|
|
|
|
|
Hello, all. I've gotten a lot of help off this forum in the past, and I appreciate it! I hope someone can help me out with this one.
I have a timer, and I want the Interval to be as small as possible (timer to run as fast as possible). However, when I set it to 1, the program actually runs slower than if I set it to a more realistic number (like 30 or 50). This is because I have a number of steps to take with each tick. If the timer were just waiting for the previous tick to finish, there would come a point at which smaller and smaller Intervals wouldn't change the speed of the timer. But, the action does, in fact, slow down more and more with small values. This tells me that the timer is skipping a tick if the previous tick hasn't finished (just a theory, mind you).
Is there a way I can make the program tell me when the Interval is too small? I want it to realize when it's not finishing the code in the tick handler fast enough.
Ideas, anyone?
-Daniel
Typing too fast fro my owngood
|
|
|
|
|
Hello
First I must say it's an interesting post you've made. Got my 5
To the issue. I thought of several solutions to this. The best thing I came up with is to test the time - or average time- of excution of your code. Maybe like this
Long FirstTick;
long BestInterval;
private void MyTickEventHandler(object sender, EventArgs e)
{
FirstTick = DateTime.Now.Ticks;
BestInterval = DateTime.Now.Ticks - FirstTick;
}
Well, I hope this works!!
Regards
|
|
|
|
|
I thought about it for a while, before I saw your reply. You're right, monitoring DateTime.Ticks is best for my situation. I decided to monitor DateTime.Now.Ticks, and keep track of the difference between how long an iteration is supposed to take, and how long it actually takes. If it was more than a certain threshold (one millisecond... I know, that's a lot), then I threw an exception. Then, instead of throwing an exception, I just increased the timer's interval. I've gotten it to run at 60 milliseconds per timer interval without a hitch.
I'll keep my checks in there, to monitor its progress with my changes (I intend to add a little more code per tick).
Thanks for the help!
-Daniel
Typing too fast fro my owngood
|
|
|
|
|
Hi there,
Which timer are you using? Windows based? the one which is in toolbar?
Did you try System.Timers.Timer? It uses Threadpool if interval is smaller than the processing time of Elapsed event handler.
Hope this might help.
|
|
|
|
|
I'm using System.Windows.Forms.Timer.
I don't have a "toolbar" because I'm using Notepad and csc.exe (it's the manly way to program, although I revert to VS2k5 for hairy problems).
-- modified at 20:48 Friday 25th August, 2006
-Daniel
Typing too fast fro my owngood
|
|
|
|
|
And probably OS dependent as well. I would imagine the best way would be to profile the method in the tick timer. The profiler may be part of the CLR (don't know never checked) then you can dynamically check the profile to set the timer tick.
On two occasions I have been asked [by members of Parliament], 'Pray, Mr. Babbage, if you put into the machine wrong figures, will the right answers come out?' I am not able rightly to apprehend the kind of confusion of ideas that could provoke such a question. - Charles Babbage
|
|
|
|
|
I don't know what it means to "profile" a method. I suspect it's a little deeper than what is needed for this program I'm working on. However, (pardon the pun) thanks for the pointer!
-Daniel
Typing too fast fro my owngood
|
|
|
|
|
Just a small question beside your actual problem:
If you really want to call some function/do some task repeatedly as fast as it is possible why do you use a timer (and not some kind of loop - probably in another thread)?
|
|
|
|
|
Why have I chosen a System.Windows.Forms.Timer? Because, I've been told by a CS PHD at my local University, multithreading is not advantageous if you're just trying to do something faster. The CPU can really only process information at a certain speed, and making two threads won't make it faster. I understand that multiple threads is handy when you want things to run independent of each other, but it's not for making a linear sequence of actions run faster. Besides, it's just a game.
On a side note, considering there are multiple entities in the game that are meant to run as autonomously as can be faked, I did consider making each entity run in its own thread. However, I decided against it, just to keep things simple.
-Daniel
Typing too fast fro my owngood
|
|
|
|
|
System.Windows.Forms.Timer is based on the WM_TIMER message with all of its associated limitations. Significantly, it is the lowest priority event of all, after painting the window. Any other message handlers which take a significant time will hold up the processing of the timer event. The system will post another timer event after the time has elapsed after the previous one was processed. The resolution of the timers is the same as the system timer tick, which on Windows XP is 15ms. On Windows 98 it is 55ms IIRC.
I don't really get on with System.Threading.Timer . Its behaviour is to fire events on the threadpool, and it has no locking to prevent the events being fired concurrently - if your first handler hasn't completed, the thread pool will (if threads are available) run it again, concurrently, on another thread. I believe the timer resolution is the same as for System.Windows.Forms.Timer . Because it runs on the threadpool, it's unsafe to run any GUI code in the handler.
System.Timers.Timer is based on System.Threading.Timer . If you set the SynchronizingObject property, the callbacks are fired synchronously on the correct thread for that object, so the limitations above don't apply - it is safe to run GUI code, and callbacks cannot occur concurrently.
For the resolution you're after, you probably need a multimedia timer. This actually tweaks the system timer resolution. See this article[^] for a C# wrapper around the multimedia timer APIs. I haven't tried this code out, so I can't make any claims for it.
|
|
|
|
|
<sincer>Thank you for the interesting insight!</sincere>
You bring up an interesting point. However, this program (a simple game) depends on the user seeing what's being painted so they can react properly. Thus, I prefer that painting have a slightly higher priority than the processing between painting.
Now that I've had time to sit on my code over the past day or two, I've realized that it's alright if the System.Windows.Forms.Timer skips a tick (if the timer is running faster than the code), because of the way I'm tracking movement. There are entities that move on the screen so-many pixels per second, and if a timer tick is skipped, it's made up in the next tick (by how I'm passing info around), so on each repaint the entities have moved the proper amount of distance.
Really, to be honest, the whole reason I wanted it to run as fast as possible is that I want it to repaint as fast as possible, so that the motion will appear as smooth as possible. I just didn't want choppy motion.
On a side note, I was going to ask what you mean by the "system timer" having a resolution of "15ms"? Is that milliseconds or microseconds? I ask because DateTime.Now.Ticks tells you a value down to the nearest 100 nanoseconds, which is a lot more accurate than "15ms," no matter what you're signifying with that 'm'. I added some code the other day that uses DateTime.Now.Ticks to measure how accurate System.Windows.Forms.Timer is running in my program. I do admit that System.Windows.Forms.Timer is not very accurate (the worst I saw was a disparity of .7 milliseconds), but it's good enough for what I need.
My original question was for a way to make the program tell me when the System.Windows.Forms.Timer.Interval was too small, and I made DateTime.Now.Ticks tell me that (by measuring how long a tick took compared with how long it should have taken).
I appreciate all the help, everyone! I'll just keep tweaking what I have. After all, I still have some stupid trig to get straight (things keep going in weird directions).
-Daniel
Typing too fast fro my owngood
|
|
|
|
|
The system timer has a resolution, typically, of 15 milliseconds. The actual value depends on the exact hardware you have. The physical timer periodically interrupts a processor, which the OS handles to fire off timer events, and to decide whether to reschedule the CPUs if there are multiple threads that can run.
The operating system counts time in 100ns intervals, it's true. However, it simply adds a fixed value to the 'current wall-clock time' variable every time a timer interrupt occurs. That value can be altered with the SetSystemTimeAdjustment API, and it's used to compensate for the slight inaccuracies that occur with the actual versus theoretical run rate of the clock, and slight issues surrounding responsiveness to the clock interrupt.
The divergence you're seeing between DateTime.Now.Ticks (which is the system clock time) and the timer interval is probably the latency in having the timer fire. If you want a time stamp with more resolution, see the QueryPerformanceCounter API, which is generally based on a processor performance monitoring register. However, on some processors this can be unpredictable as it is directly related to the core's running clock speed, and power management can vary the clock speed, so the counter doesn't count at a constant rate!
The physical hardware timer circuit is programmable. To support multimedia applications that require a better resolution for their timers, the OS can reprogram it for more frequent interrupts, which it does if an application uses the multimedia timer APIs. When all applications free their multimedia timers, the OS goes back to the default timer interval. Presumably this is to reduce the overhead in thread time accounting and thread dispatching.
|
|
|
|
|
I'm replying here because, although I got the notification message, your other post didn't show up on the forum!
Heritos Gger wrote: Don't get me wrong, I'm not arguing with you. You obviously know a lot more about it than me, I admit.
However, I still don't understand how you would say that the "system timer" has a resolution of 15 milliseconds and the "system clock time" has a resolution of 100ns. System.Windows.Forms.Timer has a resolution of one millisecond (better than 15). Are these three different timers we're talking about?(100ns,1ms,15ms resolution)
I was under the impression that there's one clock in the CPU, and everything gets chronological measurements from that (although, now that I've typed that, it sounds way too simple for CPU guts).
Thank you for your patience with me!
I need to point you to Raymond Chen's blog post, "Precision is not the same thing as accuracy"[^].
The system's clock measurements are based entirely around the Programmable Interval Timer component. This component, on x86/x64 computers, dates back to the original IBM PC, in which it was an Intel 8253 chip. In modern computers it's a circuit somewhere in one of the chipset chips (on my Intel 850-based P4 system it's hanging off the Low-Pin-Count controller, according to Device Manager where it appears as 'System timer' - this is the successor of the antique ISA bus, for devices that aren't expected to handle the complexities of PCI!)
(I've seen documentation on Wikipedia that this interval timer function is actually now performed by the Local APIC, which is a circuit of the processor which manages interrupts, so this may not be completely accurate, if your system also has an I/O APIC and Windows is using it, which most modern systems do. This would explain why the 'System timer' is shown as being in power state D3, which is the state with highest power savings and effectively means 'off'.)
Anyway, this timer component is programmed to interrupt the processor on a regular basis, by default every 15.625ms on my system. (You can find out the clock resolution using the ClockRes[^] utility.) Why the odd number? It's actually 1/64th of a second.
The SetTimer API (and hence System.Windows.Forms.Timer ) accepts an interval specified in milliseconds, GetTickCount and GetSystemTime offer a multiple of milliseconds as their result, and GetSystemTimeAsFileTime (hence DateTime.Now.Ticks ) offers multiples of 100ns. However, none of these APIs can offer this actual resolution. They're all tied to the programmable interval timer circuit's tick rate.
The system also has a real-time clock circuit introduced in the IBM AT, but that is useless for actual timekeeping since it requires a total of 6 I/O bus write/I/O bus read pairs to retrieve the actual time, and it only counts in 1 second intervals anyway. The operating system only reads from it at startup and writes to it when adjusting the clock (SetSystemTime or SetLocalTime , not every tick from the PIT circuit!) and on shutdown.
Why does the FILETIME structure (hence Ticks ) have such an absurdly high resolution? I assume it's because NT was meant to be, and was, portable to other architectures which didn't have such lame timer capabilities. You'd need at least microsecond resolution with that default clock rate; if you only had millisecond resolution and added 15ms every tick, your clock would be 4% slow, losing nearly 2 1/2 minutes every hour. If the clock is varied down to approx 1ms (which would be implemented on the PIT as 1/1024 seconds, 976.5625us) you're starting to hit the actual resolution of the structure. 62.5ns will be lost every time the timer ticks in this case, but that's less than one part per million, far better than the hardware can actually do.
-- modified at 17:17 Sunday 27th August, 2006 (messed up closing format tag)
|
|
|
|
|
The reason I replied off the forum was because I didn't want to task others' patience on what is turning out to be a detailed explanation of timers. It's venturing a little from C#.
From what you've explained, it sounds like they need to come up with a better way to track time. Perhaps they could use current sub-micron semiconductor manufacturing technology to make a quartz crystal that ocillated reliably (although I realize it would have to be a lot faster than those in watches).
My original idea was finding out exactly how much time a process took from start to finish, so that I could repeat it with as little idle time between finish and start as possible.
The more I work on this program (I've added more to its iterative processes), the more time I have to add to myTimer.Interval. I guess as long as the process doesn't take more than 15 fps, I should be fine (because, after all, it's just a stupid game... a game I get the feeling I'm making more complicated that it needs to be).
Thanks for the information!
-Daniel
Typing too fast fro my owngood
|
|
|
|
|
Does anyone know what format string I need to pass into the DateTime ToString() method to display the current date and time as 08/25/2006 14:48? Thanks.
|
|
|
|
|
See the "Custom date formatting" section here[^].
/ravi
|
|
|
|
|
Use the "g" or "G" for general date. The lower case g will give you to minutes as you asked (short date and short time). If you use capital G, you also get seconds (short date and long time.
If you do not want the AM/PM notation, use a custom format mask "M/d/yyyy m:h". Note, capitalization is important. Use M for month and m for minutes. If you use h you get 12 hour notation, if you use H, you get 24 hour notation.
David
|
|
|
|
|
DateTime yourDateTime = DateTime.Now;
String.Format("{0:M/d/yyyy h:m}", yourDateTime);
-Have Fun!
|
|
|
|
|
If you are calling the ToString method of the DateTime object, you would want to use the following:
public void sample()
{
// Create a new DateTime instance set to
// 9/1/2006 7:22 PM
DateTime d = new DateTime(2006, 9, 1, 14, 22, 0);
Console.WriteLine(d.ToString(@"MM/dd/yyyy HH:mm"));
}
|
|
|
|
|
I am getting this error when trying to use the Threading in PingReply:
Cross-thread operation not valid: Control 'lstHosts' accessed from a thread other than the thread it was created on.
THIS IS THE CODE:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Net;
using System.Net.NetworkInformation;
using System.Threading;
namespace HostHealth
{
public partial class frmMain : Form
{
private Thread ping_thread = null;
int listview_item;
public frmMain()
{
InitializeComponent();
}
private void ping_to_host()
{
for (listview_item = 0; listview_item <= lstHosts.Items.Count - 1; listview_item++)
{
Ping ping_sender = new Ping();
PingOptions ping_options = new PingOptions();
ping_options.DontFragment = true;
PingReply ping_reply = ping_sender.Send(lstHosts.Items[listview_item].SubItems[1].Text);
if (ping_reply.Status == IPStatus.Success)
{
lstHosts.Items[listview_item].SubItems[0].Text = "Success";
lstHosts.Items[listview_item].SubItems[2].Text = ping_reply.RoundtripTime.ToString();
lstHosts.Items[listview_item].SubItems[3].Text = ping_reply.Options.Ttl.ToString();
lstHosts.Items[listview_item].BackColor = Color.Black;
}
else
{
lstHosts.Items[listview_item].SubItems[0].Text = ping_reply.Status.ToString();
lstHosts.Items[listview_item].BackColor = Color.Red;
}
toolStart.Text = "Idle - " + DateTime.Now;
ping_thread.Abort();
}
}
private void frmMain_Shown(object sender, EventArgs e)
{
lstHosts.Columns.Add("Status");
lstHosts.Columns.Add("Where");
lstHosts.Columns.Add("time");
lstHosts.Columns.Add("ttl");
lstHosts.Columns[0].Text = "Status";
lstHosts.Columns[1].Text = "Where";
lstHosts.Columns[2].Text = "time";
lstHosts.Columns[3].Text = "ttl";
lstHosts.Columns[0].Width = 200;
lstHosts.Columns[1].Width = 200;
lstHosts.Columns[2].Width = 80;
lstHosts.Columns[3].Width = 80;
lstHosts.Columns[0].TextAlign = HorizontalAlignment.Left;
lstHosts.Columns[1].TextAlign = HorizontalAlignment.Left;
lstHosts.Columns[2].TextAlign = HorizontalAlignment.Center;
lstHosts.Columns[3].TextAlign = HorizontalAlignment.Center;
DataSet dsHosts = new DataSet("hosts");
dsHosts.ReadXml("C:\\Users\\Jassim\\Documents\\Visual Studio 2005\\Projects\\HostHealth\\hosts.xml");
foreach (DataRow drHosts in dsHosts.Tables[0].Rows)
{
lstHosts.Items.Add("Pending..");
lstHosts.Items[lstHosts.Items.Count - 1].SubItems.Add(drHosts["IPAddress"].ToString());
lstHosts.Items[lstHosts.Items.Count - 1].SubItems.Add("");
lstHosts.Items[lstHosts.Items.Count - 1].SubItems.Add("");
}
}
private void toolStart_Click(object sender, EventArgs e)
{
if (toolStart.Text == "START")
{
toolStatus.Text = "Idle";
toolStart.Text = "STOP!!";
toolStart.ForeColor = Color.Red;
toolStart.ToolTipText = " Stop Monitoring ";
timerPing.Enabled = true;
}
else
{
timerPing.Enabled = false;
toolStatus.Text = "Off";
toolStart.Text = "START";
toolStart.ForeColor = Color.Black;
toolStart.ToolTipText = " Start Monitoring ";
}
}
private void timerPing_Tick(object sender, EventArgs e)
{
this.ping_thread = new Thread(new ThreadStart(this.ping_to_host));
this.ping_thread.Start();
ping_to_host();
}
}
}
|
|
|
|
|
It is rather self-explanatory. You are tring to access the listbox in the thread you call ping_to_host on. UI elements may only be manipulated from the thread on which they were created. You need to create an event handler to update your listbox or use invoke so it will be called on the proper thread.
only two letters away from being an asset
|
|
|
|
|
Hi all
i want to receive fax with C# 2005 .
Help me please.
thx a lot
|
|
|
|
|
|
i try to find sample code but I can't find
|
|
|
|
|