A timer func problem???

  • Thread starter Thread starter Cem Louis
  • Start date Start date
C

Cem Louis

Hi,

I have the below code which runs after choosing an item from the
listbox (choose the first one). Goes to the below item after 5 seconds
and then goes to another after 5 sec again... So here is my question:
I have a func which I named as process() I want to run this func only
once when each item is selected in the listbox? So how can I do
that???

Thank you,
Cem Louis

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

namespace WindowsApplication14
{
///
/// Summary description for Form1.
///
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.ListBox listBox1;
private System.Windows.Forms.Button button1;
private System.Timers.Timer timerClock = new System.Timers.Timer();
///
/// Required designer variable.
///
private System.ComponentModel.Container components = null;

public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
InitializeTimer();

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

public void InitializeTimer()
{
this.timerClock.Elapsed += new ElapsedEventHandler(OnTimer);
this.timerClock.Interval = 5000;
}

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

#region Windows Form Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
private void InitializeComponent()
{
this.listBox1 = new System.Windows.Forms.ListBox();
this.button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// listBox1
//
this.listBox1.Location = new System.Drawing.Point(8, 8);
this.listBox1.Name = "listBox1";
this.listBox1.Size = new System.Drawing.Size(120, 95);
this.listBox1.TabIndex = 0;
//
// button1
//
this.button1.Location = new System.Drawing.Point(8, 112);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(120, 23);
this.button1.TabIndex = 1;
this.button1.Text = "Run";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(136, 142);
this.Controls.Add(this.button1);
this.Controls.Add(this.listBox1);
this.Name = "Form1";
this.Text = "Form1";
this.Load += new System.EventHandler(this.Form1_Load);
this.ResumeLayout(false);

}
#endregion

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

private void Form1_Load(object sender, System.EventArgs e)
{
listBox1.Items.Add("Arthur");
listBox1.Items.Add("Alex");
listBox1.Items.Add("Amie");
listBox1.Update();
}

private void OnTimer(object source, ElapsedEventArgs e)
{
this.nextvalue(this.listBox1.SelectedIndex);
}

private void button1_Click(object sender, System.EventArgs e)
{
if(this.listBox1.SelectedItem!=null)
{
this.timerClock.Start();
}
else
{
MessageBox.Show("Select an Item");
}
}

private void nextvalue(int currentPosition)
{
if(currentPosition+1<=this.listBox1.Items.Count-1)
{
this.listBox1.SetSelected(currentPosition+1,true);
}
else
{
this.timerClock.Stop();
}
}

private void process()
{
// Does something in an 5 second interval
// Must run once
}
}
}
 
Hi Cem,

The simple answer is:
Change:
private void OnTimer(object source, ElapsedEventArgs e)
{
this.nextvalue(this.listBox1.SelectedIndex);
}

to:
private void OnTimer(object source, ElapsedEventArgs e)
{
this.process();
this.nextvalue(this.listBox1.SelectedIndex);
}

The more complex answer is: why are you using the user interface to drive
internal logic? If you really need to insure that the process only happens
once, then when the button is clicked, you would copy the contents of the
list into an internal collection. Then, at each interval, you would pull
the top item off of the collection, select it in the listbox, and run the
process. Discard the item from the internal list when you are done.

That way, if the user clicks around in the listbox, it won't matter... you
will always invoke the items in the correct order, starting from the correct
place, no matter what the user does during the interval.

Is this a homework assignment?
--- Nick

Cem Louis said:
Hi,

I have the below code which runs after choosing an item from the
listbox (choose the first one). Goes to the below item after 5 seconds
and then goes to another after 5 sec again... So here is my question:
I have a func which I named as process() I want to run this func only
once when each item is selected in the listbox? So how can I do
that???

Thank you,
Cem Louis

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

namespace WindowsApplication14
{
///
/// Summary description for Form1.
///
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.ListBox listBox1;
private System.Windows.Forms.Button button1;
private System.Timers.Timer timerClock = new System.Timers.Timer();
///
/// Required designer variable.
///
private System.ComponentModel.Container components = null;

public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
InitializeTimer();

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

public void InitializeTimer()
{
this.timerClock.Elapsed += new ElapsedEventHandler(OnTimer);
this.timerClock.Interval = 5000;
}

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

#region Windows Form Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
private void InitializeComponent()
{
this.listBox1 = new System.Windows.Forms.ListBox();
this.button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// listBox1
//
this.listBox1.Location = new System.Drawing.Point(8, 8);
this.listBox1.Name = "listBox1";
this.listBox1.Size = new System.Drawing.Size(120, 95);
this.listBox1.TabIndex = 0;
//
// button1
//
this.button1.Location = new System.Drawing.Point(8, 112);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(120, 23);
this.button1.TabIndex = 1;
this.button1.Text = "Run";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(136, 142);
this.Controls.Add(this.button1);
this.Controls.Add(this.listBox1);
this.Name = "Form1";
this.Text = "Form1";
this.Load += new System.EventHandler(this.Form1_Load);
this.ResumeLayout(false);

}
#endregion

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

private void Form1_Load(object sender, System.EventArgs e)
{
listBox1.Items.Add("Arthur");
listBox1.Items.Add("Alex");
listBox1.Items.Add("Amie");
listBox1.Update();
}

private void OnTimer(object source, ElapsedEventArgs e)
{
this.nextvalue(this.listBox1.SelectedIndex);
}

private void button1_Click(object sender, System.EventArgs e)
{
if(this.listBox1.SelectedItem!=null)
{
this.timerClock.Start();
}
else
{
MessageBox.Show("Select an Item");
}
}

private void nextvalue(int currentPosition)
{
if(currentPosition+1<=this.listBox1.Items.Count-1)
{
this.listBox1.SetSelected(currentPosition+1,true);
}
else
{
this.timerClock.Stop();
}
}

private void process()
{
// Does something in an 5 second interval
// Must run once
}
}
}
 
Hi Nick,

I tried your simple solution but it doesn't work because I am running a
webrequest in my process function (taking db values of my website)
process func runs several times I want it to run only once... And your
second solution is a bit complex for me... Can you make it simpler for
me? If you have time can you send a sample?

Thank you for your attention,
Cem Louis
 
Back
Top