Click to See Complete Forum and Search --> : How to stop a process using a "Stop Button"


mariop
August 5th, 2010, 07:29 AM
Hi, I created a simple window with two buttons,
the first one calls a function that lasts a long time,
the second one sets the value of a variable "stop" to TRUE,
that was initially set to FALSE.

My intention is that, by pressing the first button it runs a long process,
that controls if the stop variable is set to TRUE or FALSE for every loop,
if the value is TRUE the function should return, so the process is stopped.



...

static BOOL stop = FALSE; // My variable defined somewhere

...

int longProcess () // My function
{
while(stop == FALSE) {
// do something
}
return 0;
}

...

switch (msg)
{
case WM_CREATE:
{
...

Button1 = CreateWindowEx(0,
TEXT("BUTTON"),
TEXT("Start"),
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
100, 100, 100, 20,
hWnd,
(HMENU)BUTTON_START,
NULL,
NULL);

Button2 = CreateWindowEx(0,
TEXT("BUTTON"),
TEXT("Stop"),
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
200, 200, 100, 20,
hWnd,
(HMENU)BUTTON_STOP,
NULL,
NULL);
...

}
break;

case WM_COMMAND:
{
switch (LOWORD(wParam))
{

case BUTTON_START:
longProcess(); // Starts the process
break;

case BUTTON_STOP:
stop = TRUE; // Should stop the process
break;

}
}
break;

...

}
}

The problem is that when I press the first button the process starts normally,
but when I press the second button in order to stop the process nothing happens,
I noticed that the stop variable is set to TRUE only after the end of the process.
I thought that probably in a problem related to the message queue...

What could be the best solution???

Thanks!

VictorN
August 5th, 2010, 09:10 AM
What could be the best solution???

Thanks!The best solution is to create a worker thread and move the code for long computation in this thread.

TheComputer
August 7th, 2010, 03:45 PM
Using a flag like that might be most appropriate in polling
If you create a worker thread, then there are start-worker-thread, end-worker-thread and pause-worker-thread functions for you to do the long process

mani3355
August 12th, 2010, 12:38 AM
hi,

I am mani
pl give to me a best solution, that is .....
when I press the first button the process starts normally,
but when I press the second button in order to stop the process nothing happens,
I noticed that the stop variable is set to TRUE only after the end of the process.

thanks for advice



regards,
phe9oxis,
http://www.guidebuddha.com

JohnCz
September 3rd, 2010, 07:00 AM
There is a reason for two answers suggesting worker thread. Still possible but not recommended a local loop that would allow idle processing.
I am not sure what do you mean by starting process; I am assuming that you mean long processing that takes place in the man execution thread, like a while or for loop.
Doing this takes all CPU time for your application and does not allow for use UI to update. Also makes all controls inaccessible (appear to be frozen) since thread is not able to process any messages because of the loop.
I bet you press the button but it does not go down. Windows delivers message to a que but they are retrieved after processing a loop is done.
Hence, follow advice and do it in a worker thread.