Intel® Fortran Compiler
Build applications that can scale for the future with optimized code designed for Intel® Xeon® and compatible processors.

Not responding

jaeger0
Beginner
1,452 Views
I wrot a quick-win application, which does a lot of computations. Therefore I have used a Progress bar. However, when a really long computation is done, and the user sometimes clicks to the application, the Windows message (.. is not responding appears). This is unsuitable for the user. How can I handle that problem ?
0 Kudos
9 Replies
jdiven
Beginner
1,452 Views
Quoting - jaeger0
I wrot a quick-win application, which does a lot of computations. Therefore I have used a Progress bar. However, when a really long computation is done, and the user sometimes clicks to the application, the Windows message (.. is not responding appears). This is unsuitable for the user. How can I handle that problem ?

Do you change the cursor to an hourglass while a long calculation is being performed?Also, is it possible to estimate the length of time the calculation will require and display this estimate before beginning?

0 Kudos
jaeger0
Beginner
1,452 Views
Quoting - jdiven

Do you change the cursor to an hourglass while a long calculation is being performed?Also, is it possible to estimate the length of time the calculation will require and display this estimate before beginning?


No, I do not change the cursor to an Hourglass. It is not straitforward to estimate the time for calculation.

The Problem is, I have a Progress bar, which should show the Progress, but however, sometimes, the Progress bar does not update the displaying, and If I click on my Aplication or on the Progress bar. The cursor change to the Hourglass and says "Not responding". It would be nice, to know, the actual progress state,

0 Kudos
Jugoslav_Dujic
Valued Contributor II
1,452 Views
Quoting - jaeger0


No, I do not change the cursor to an Hourglass. It is not straitforward to estimate the time for calculation.

The Problem is, I have a Progress bar, which should show the Progress, but however, sometimes, the Progress bar does not update the displaying, and If I click on my Aplication or on the Progress bar. The cursor change to the Hourglass and says "Not responding". It would be nice, to know, the actual progress state,

The cause is as follows: your application cannot do two things at the same time without additional threads -- while you're doing the number crunching, your application windows do not redraw themselves. To observe an even worse effect, do an Alt+Tab or drag another window over your application's while the calculation is running. Other menus don't work etc.

Your callbacks, in general, should be quick, to allow the application to be responsive

There are several ways to overcome the problem:

* QuickWin alrady has two threads -- the "secondary" one runs within the PROGRAM. You can move the calculating code from the callback there (rather than just doing nothing in the loop), and just "raise" a flag when calculation should be started/stopped

* Google "ThreadDlg"

* Call PeekMessage in a loop every while during the calculation.

0 Kudos
jaeger0
Beginner
1,452 Views
Quoting - Jugoslav Dujic

The cause is as follows: your application cannot do two things at the same time without additional threads -- while you're doing the number crunching, your application windows do not redraw themselves. To observe an even worse effect, do an Alt+Tab or drag another window over your application's while the calculation is running. Other menus don't work etc.

Your callbacks, in general, should be quick, to allow the application to be responsive

There are several ways to overcome the problem:

* QuickWin alrady has two threads -- the "secondary" one runs within the PROGRAM. You can move the calculating code from the callback there (rather than just doing nothing in the loop), and just "raise" a flag when calculation should be started/stopped

* Google "ThreadDlg"

* Call PeekMessage in a loop every while during the calculation.


I Tried the mehod using PeekMessage. I don't like the method, using this Thread stuff (similar in ThreadDlg), because I have several longer Computations, which would require a lot of rewriting, and they are parallized routines. So I'm not sure if the method with Thread will work.

At the beginning It worked, but, when I added a Stop button, the Peek_Message loop never retured.
What ist the problem ? If I remove the"DlgSetSub(dlg, IDC_PROGRESS_STOP, Update_Progress)" , than the loop returns. But, the Subroutine Update_Progress, where I check if the Stop button was pressed, is never called.

Generally I do the following, at the beginning of a long computation I Initialize the Progress_bar, During computation I call the Progress_bar to update the progress. It works fine, but if I use the Stop Button subroutine, the Loop never returns. In the message msg, during the loop is always the same value. So I tried to skip out of the loop, after a certain time passed. However the Subroutine Update_Progress is never called.

subroutine Progress_Bar(init_flag, progress)

if (init_flag .EQ. 1) then
retlog=DlgInit(IDD_Progress_Dlg,dlg)
retlog=DlgSetSub(dlg, IDC_PROGRESS_STOP, Update_Progress)
retlog=DlgModeless(Dlg_prog)
else
retlog=DlgSet(Dlg,IDC_PROGRESS_BAR, progress,DLG_POSITION)
retlog = .TRUE.
do while (retlog)
retlog=PeekMessage(msg,hwnd,0,0, PM_REMOVE)
enddo
endif
end subroutine

0 Kudos
Paul_Curtis
Valued Contributor I
1,452 Views

I think the OP's situation relates more to how to use Windows than to Fortran, and the problem is compounded by using Quickwin. The way to have a live progress bar track a long computational loop is--

1) put the computation in a separate thread from the main program

2) the program needs to manage its own Windows message loop (sorry, no Quickwin)

3) Prior to the start of computation, a progress-bar dialog is created as a child to the main window

4) add a Windows timer to the main program loop, which will send a Windows message to the progress-bar dialog at some defined interval, say every 500 msec.

5) when the progress-bar dialog gets a timer ping, it updates the visual state of the progress-bar control by referencing the (module-scoped, and hence accessible) computation progress variable

Note that this architecture also facilitates having live buttons to stop or pause the computation, as part of the progress-bar dialog.

0 Kudos
g_f_thomas
Beginner
1,452 Views


QuickWin isa dumb down library that hasn'tbeen supported for eons. Perhaps it's time to bite the bullet and try your hand at .NET if you are not Windows APIinclined. BTW, the tips given by Jugoslav and Paul are bang on.

Gerry

0 Kudos
Steven_L_Intel1
Employee
1,452 Views

QuickWin is supported, but I'll agree that it is not as capable as using the Win32 API directly.

0 Kudos
g_f_thomas
Beginner
1,452 Views


QuickWin may be supported by Intel but not so bythe vendor (MS). It's deemed to have outlived its original purpose by a decade or so.

Gerry

0 Kudos
Jugoslav_Dujic
Valued Contributor II
1,452 Views
Quoting - jaeger0

I Tried the mehod using PeekMessage. I don't like the method, using this Thread stuff (similar in ThreadDlg), because I have several longer Computations, which would require a lot of rewriting, and they are parallized routines. So I'm not sure if the method with Thread will work.


do while (retlog)
retlog=PeekMessage(msg,hwnd,0,0, PM_REMOVE)
enddo

I didn't mean "Call PeekMessage in a loop" that literally :-).

Here's an example of "asynchronous message loop" I meant:

http://software.intel.com/en-us/forums/showpost.php?p=13555

Jugoslav

0 Kudos
Reply