473,414 Members | 1,675 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,414 software developers and data experts.

Providing feedback during heavy calculation

Hello everybody,

I hope anybody can help me. I'll try to give a brief overview of my
problem. I have running a program that performs a heavy calculation.
To give the user feedback what the program is doing I show a window
which contains a progress bar and a label. At some point during the
execution the state of the calculation is changed, so I want to let
the user know this.
I have placed the creation of the form in a seperate thread and
created a timer that checks every second if the status is changed.
This timer works good, but the form is not refreshed, i.e. it is not
showing the new status.
What is the problem here?
I have included a piece of the code (see below).

Thanks for your time and help,

Michiel

public class CalcThread
{
private int counter;
private int calcStatus;
private System.Threading.Timer tmrCalc;
private frmWait frmCalc;

// Constructor accepts "parameters" meant for the ThreadStart
delegate.
public CalcThread()
{
counter = 0;
calcStatus = 0;
}

// ThreadStart delegate is a parameterless method of the threaded
class.
public void Launch()
{
/* Create a wait form */
frmCalc = new frmWait();
frmCalc.setStateText(calcStatus);
frmCalc.Show();
frmCalc.Refresh();

/* Create the delegate that invokes methods for the timer */
TimerCallback timerDelegate = new TimerCallback(CheckStatus);

/* Create a timer that waits one second, then invokes every second
*/
System.Threading.Timer timer = new
System.Threading.Timer(timerDelegate, null, 1000, 1000);

/* Keep a handle to the timer, so it can be disposed */
tmrCalc = timer;
counter = 0;
}

public void Abort()
{
tmrCalc.Dispose();
tmrCalc = null;
}

public void Update(int status)
{
calcStatus = status;
}

public int CalcTime()
{
return counter;
}

private void CheckStatus(Object state)
{
counter++;
frmCalc.setStateText(calcStatus);
frmCalc.setCalcText();
frmCalc.Refresh();
Application.DoEvents();
Console.WriteLine("{0} Checking Status {1}.",
DateTime.Now.TimeOfDay, counter);
}
}

/* The application */
private void btnCalculate_Click(object sender, System.EventArgs e)
{
/* show calculation message */
calcStatus = 0;
CalcThread calcThread = new CalcThread();
thWait = new Thread(new ThreadStart(calcThread.Launch));
thWait.Start();

// The heavy calculation

calcThread.Update(++calcStatus);

// More heavy calculation

calc_time = calcThread.CalcTime();
calcThread.Abort();
thWait.Abort();
}
Nov 15 '05 #1
4 3249
Cant you register a callback? IF its lengthy, stick it in a thread and have
the caller register a callback or data or signal an event.

--

Jack Mayhoff
Microsoft Online Partner Support
Get Secure! - www.microsoft.com/security
This posting is provided "as is" with no warranties and confers no rights.

"Michiel Alsters" <dj**************@hotmail.com> wrote in message
news:5c**************************@posting.google.c om...
Hello everybody,

I hope anybody can help me. I'll try to give a brief overview of my
problem. I have running a program that performs a heavy calculation.
To give the user feedback what the program is doing I show a window
which contains a progress bar and a label. At some point during the
execution the state of the calculation is changed, so I want to let
the user know this.
I have placed the creation of the form in a seperate thread and
created a timer that checks every second if the status is changed.
This timer works good, but the form is not refreshed, i.e. it is not
showing the new status.
What is the problem here?
I have included a piece of the code (see below).

Thanks for your time and help,

Michiel

public class CalcThread
{
private int counter;
private int calcStatus;
private System.Threading.Timer tmrCalc;
private frmWait frmCalc;

// Constructor accepts "parameters" meant for the ThreadStart
delegate.
public CalcThread()
{
counter = 0;
calcStatus = 0;
}

// ThreadStart delegate is a parameterless method of the threaded
class.
public void Launch()
{
/* Create a wait form */
frmCalc = new frmWait();
frmCalc.setStateText(calcStatus);
frmCalc.Show();
frmCalc.Refresh();

/* Create the delegate that invokes methods for the timer */
TimerCallback timerDelegate = new TimerCallback(CheckStatus);

/* Create a timer that waits one second, then invokes every second
*/
System.Threading.Timer timer = new
System.Threading.Timer(timerDelegate, null, 1000, 1000);

/* Keep a handle to the timer, so it can be disposed */
tmrCalc = timer;
counter = 0;
}

public void Abort()
{
tmrCalc.Dispose();
tmrCalc = null;
}

public void Update(int status)
{
calcStatus = status;
}

public int CalcTime()
{
return counter;
}

private void CheckStatus(Object state)
{
counter++;
frmCalc.setStateText(calcStatus);
frmCalc.setCalcText();
frmCalc.Refresh();
Application.DoEvents();
Console.WriteLine("{0} Checking Status {1}.",
DateTime.Now.TimeOfDay, counter);
}
}

/* The application */
private void btnCalculate_Click(object sender, System.EventArgs e)
{
/* show calculation message */
calcStatus = 0;
CalcThread calcThread = new CalcThread();
thWait = new Thread(new ThreadStart(calcThread.Launch));
thWait.Start();

// The heavy calculation

calcThread.Update(++calcStatus);

// More heavy calculation

calc_time = calcThread.CalcTime();
calcThread.Abort();
thWait.Abort();
}

Nov 15 '05 #2
Michiel Alsters <dj**************@hotmail.com> wrote:
I hope anybody can help me. I'll try to give a brief overview of my
problem. I have running a program that performs a heavy calculation.
To give the user feedback what the program is doing I show a window
which contains a progress bar and a label. At some point during the
execution the state of the calculation is changed, so I want to let
the user know this.
I have placed the creation of the form in a seperate thread and
created a timer that checks every second if the status is changed.
This timer works good, but the form is not refreshed, i.e. it is not
showing the new status.


Rather than creating a timer to check the status, you should have your
calculation thread update the GUI periodically. You'll need to use
Control.Invoke to make sure the GUI is updated in the appropriate
thread.

--
Jon Skeet - <sk***@pobox.com>
http://www.pobox.com/~skeet
If replying to the group, please do not mail me too
Nov 15 '05 #3
I'm not sure, but I think the problem might be that your "wait form" is not
created on the UI thread. I have a very similar application that works
well, but I designed it as follows:

A. Use an item on the UI form itself (vi the MDE Form designer), like a
progress bar, or text box, that will
display calculations/progress from the calculator thread.

B. Put a System.Windows.Forms.Timer on the UI form too (via the MDE Forms
designer's "toolbox"). I suppose a Threading.Timer would work as well,
but it is easier to let
the forms designer generate the timer's callback.

C. When the user Clicks the button to start the calculation:
1. Start the timer.
2. Start the long calculation's thread.

D. In the callback for the timer click (generated by the forms designer in
the MDE):
stop the timer.
lock the calculation thread's counter.
display the counter.
unlock the counter.
start the timer.

Be sure to lock the counter in the thread that does the long calculation
before you update it in that thread.

I believe the logic is about the same that you have, except the "progress
form" is just an item on the UI's form, the timer is a Forms.Timer, there is
no separate thread for updating the progress counter, but it is done on the
UI thread. Also, there is no need for the Application.DoEvents();

As others have suggested, it is sometimes better to let the long calculation
create an event to update UI. But your design has the advantage that the UI
is updated after a constant time interval, which is a bit more pleasing to
the eye.

"Michiel Alsters" <dj**************@hotmail.com> wrote in message
news:5c**************************@posting.google.c om...
Hello everybody,

I hope anybody can help me. I'll try to give a brief overview of my
problem. I have running a program that performs a heavy calculation.
To give the user feedback what the program is doing I show a window
which contains a progress bar and a label. At some point during the
execution the state of the calculation is changed, so I want to let
the user know this.
I have placed the creation of the form in a seperate thread and
created a timer that checks every second if the status is changed.
This timer works good, but the form is not refreshed, i.e. it is not
showing the new status.
What is the problem here?
I have included a piece of the code (see below).

Thanks for your time and help,

Michiel

public class CalcThread
{
private int counter;
private int calcStatus;
private System.Threading.Timer tmrCalc;
private frmWait frmCalc;

// Constructor accepts "parameters" meant for the ThreadStart
delegate.
public CalcThread()
{
counter = 0;
calcStatus = 0;
}

// ThreadStart delegate is a parameterless method of the threaded
class.
public void Launch()
{
/* Create a wait form */
frmCalc = new frmWait();
frmCalc.setStateText(calcStatus);
frmCalc.Show();
frmCalc.Refresh();

/* Create the delegate that invokes methods for the timer */
TimerCallback timerDelegate = new TimerCallback(CheckStatus);

/* Create a timer that waits one second, then invokes every second
*/
System.Threading.Timer timer = new
System.Threading.Timer(timerDelegate, null, 1000, 1000);

/* Keep a handle to the timer, so it can be disposed */
tmrCalc = timer;
counter = 0;
}

public void Abort()
{
tmrCalc.Dispose();
tmrCalc = null;
}

public void Update(int status)
{
calcStatus = status;
}

public int CalcTime()
{
return counter;
}

private void CheckStatus(Object state)
{
counter++;
frmCalc.setStateText(calcStatus);
frmCalc.setCalcText();
frmCalc.Refresh();
Application.DoEvents();
Console.WriteLine("{0} Checking Status {1}.",
DateTime.Now.TimeOfDay, counter);
}
}

/* The application */
private void btnCalculate_Click(object sender, System.EventArgs e)
{
/* show calculation message */
calcStatus = 0;
CalcThread calcThread = new CalcThread();
thWait = new Thread(new ThreadStart(calcThread.Launch));
thWait.Start();

// The heavy calculation

calcThread.Update(++calcStatus);

// More heavy calculation

calc_time = calcThread.CalcTime();
calcThread.Abort();
thWait.Abort();
}

Nov 15 '05 #4
Thanks, this helped a lot. I finally put both the calculation and the
message form in a seperate thread. This was the trick. This way I
could, as you sugested, suspend the calculation thread and update the
UI.

Thanks.

"Fred Mellender" <no****************@frontiernet.net> wrote in message news:<aO*****************@news02.roc.ny>...
I'm not sure, but I think the problem might be that your "wait form" is not
created on the UI thread. I have a very similar application that works
well, but I designed it as follows:

A. Use an item on the UI form itself (vi the MDE Form designer), like a
progress bar, or text box, that will
display calculations/progress from the calculator thread.

B. Put a System.Windows.Forms.Timer on the UI form too (via the MDE Forms
designer's "toolbox"). I suppose a Threading.Timer would work as well,
but it is easier to let
the forms designer generate the timer's callback.

C. When the user Clicks the button to start the calculation:
1. Start the timer.
2. Start the long calculation's thread.

D. In the callback for the timer click (generated by the forms designer in
the MDE):
stop the timer.
lock the calculation thread's counter.
display the counter.
unlock the counter.
start the timer.

Be sure to lock the counter in the thread that does the long calculation
before you update it in that thread.

I believe the logic is about the same that you have, except the "progress
form" is just an item on the UI's form, the timer is a Forms.Timer, there is
no separate thread for updating the progress counter, but it is done on the
UI thread. Also, there is no need for the Application.DoEvents();

As others have suggested, it is sometimes better to let the long calculation
create an event to update UI. But your design has the advantage that the UI
is updated after a constant time interval, which is a bit more pleasing to
the eye.

Nov 15 '05 #5

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

11
by: Wolfgang Kaml | last post by:
Hello All, I have been working on this for almost a week now and I haven't anything up my sleeves anymore that I could test in addition or change.... Since I am not sure, if this is a Windows...
19
by: Blair Adamache | last post by:
IBM is hosting a user focus session to get feedback on a new design concept for installing software products and maintenance. The information below gives a brief summary of the information about...
1
by: Richard Hollenbeck | last post by:
I noticed I can't push a value into a text box by saying something like, "txtThisTextBox = intSomeVariable * 0.5" because I get an run-time error saying I can't assign a value to this object....
38
by: George Sexton | last post by:
We're in the process of re-launching our web calendar product. We would like to get your opinions on a couple of things about our site and product. This is a relaunch of an existing product with...
10
by: roygon | last post by:
Hello, I have a C# application that runs a relatively complex simulation which, on a typical computer, could take up to 10 seconds. I am now trying to port this application over to ASP.NET so...
1
by: vincec | last post by:
Hi need some help from you guysin using visual C++. I am thinking of opening a text file after some calculation. For example, after i press the "calculation", then at the OnCalculation function, it...
0
by: k04jg02 | last post by:
Python has a nifty operator that will take a container and pass its elements as function parameters. In Python you can make a list like so: x = Then you can say: f(*x)
9
by: gs | last post by:
the feedback for the install of c#2008 places 97 to 99% cpu load for way too long on athlon x64 3800+ PC. 3/4 an hour later its only about 80% complete, continuing with 98% CPU load! Next time...
5
by: RobinS | last post by:
My company is considering moving up from .Net 2.0 to .Net 3.5(SP1) as a prerequisite on the ClickOnce deployment for our application. Does anybody have any experience deploying .Net 3.5 either as...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new...
0
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.