-
July 24th, 2024, 07:38 AM
#1
win32 - How to interrupt execution
Hi,
this seems to be a common task - but I have no idea how to set about, nor could I find any helpful information in the windows manuals.
When my code enters in a lengthy evaluation of data, I want to be able to abort the execution of this loop. I have a dialog with a progress bar and a cancel-Button. But I cannot click this button while the process is running - so I cannot interrupt or abort the process. Here is my code (I am using fortran, if there is a forum on this site better suited for my problem, please let me know):
Code:
hProgress = CreateDialog(NULL, IDD_PROGRESS, hWnd, loc(DN_PrgrsDlgProc))
cRslt = 'Schneller Vorlauf 'C
iRslt = SetDlgItemText (hProgress, IDC_PROGRESSTEXT, cRslt)
iRslt = UpdateWindow (hProgress)
hBar = GetDlgItem (hProgress, IDC_PROGRESSBAR)
iNSteps = (iRunEnd - iiSimZeit) / iiTimeStep
iCount = 0
hAbort= GetDlgItem(hProgress, IDCANCEL)
do
iiSimZeit = iiSimZeit + iiTimeStep
if (iiSimZeit .gt. 0) iRslt = DN_Update() ! t = 0 wird von InitSim gef?llt, daher 0 ?berspringen!
if (iiSImZeit .gt. iRunEnd) exit
iRslt = DN_SetLoad () ! EEG-Erzeugungen bestimmen
iRslt = DN_EuroDispo () ! Strom-Verteilung in Europa
iRslt = DN_AutoDispatch() ! Residuallast ausgleichen
irslt = DN_Eval() ! Netzstr?me errechnen
!iRslt = DN_Redispatch() ! Knotenlasten, d.h. Kraftwerke und Kreise an die Netzkapazit?ten anpassen
iRslt = DN_SumUp () ! Daten zusammenstellen
nRun = nRun + 1
iRslt = DN_OutComes(nRun) ! Ergebnisse ausgeben
iCount = iCount + 1
iRslt = iCount * 100 / iNSteps
iRslt = SendMessage (hBar, PBM_SETPOS, iRslt, 0)
enddo
lRslt = DestroyWindow (hProgress)
The loop runs for several minutes and I want to be able to stop it without stopping the application. I my mind this boils down to the question how I can make the cancel-button to react to mouse input. Once this is possible I may be able to check the state or process messages in my process-dialog-procedure.
-
July 24th, 2024, 09:37 AM
#2
Re: win32 - How to interrupt execution
The usual way to work with a lengthy calculations etc. with the possibility to cancel it is putting these lengthy calculations in a worker thread.
Unfortunately I don't know if it's possible in FORTRAN (since I don't use it for about 30 years.)
Victor Nijegorodov
-
July 24th, 2024, 10:59 AM
#3
Re: win32 - How to interrupt execution
For an article on using worker threads with c, see:
http://www.flounder.com/workerthreads.htm
All advice is offered in good faith only. All my code is tested (unless stated explicitly otherwise) with the latest version of Microsoft Visual Studio (using the supported features of the latest standard) and is offered as examples only - not as production quality. I cannot offer advice regarding any other c/c++ compiler/IDE or incompatibilities with VS. You are ultimately responsible for the effects of your programs and the integrity of the machines they run on. Anything I post, code snippets, advice, etc is licensed as Public Domain https://creativecommons.org/publicdomain/zero/1.0/ and can be used without reference or acknowledgement. Also note that I only provide advice and guidance via the forums - and not via private messages!
C++23 Compiler: Microsoft VS2022 (17.6.5)
-
July 24th, 2024, 02:18 PM
#4
Re: win32 - How to interrupt execution
Oh, I almost feared that this might not be as easy as it looks.
Thanks to you both, I will try my luck with threading
N.
-
July 25th, 2024, 03:51 AM
#5
Re: win32 - How to interrupt execution
The 'cheat quick and dirty' way is to use PeekMessage() in the calculation loop and exit the calculation if required messages are in the message queue. This will slow down the calculation loop (probably substantially). But much better to do it 'properly' using a worker thread.
https://learn.microsoft.com/en-us/wi...r-peekmessagea
All advice is offered in good faith only. All my code is tested (unless stated explicitly otherwise) with the latest version of Microsoft Visual Studio (using the supported features of the latest standard) and is offered as examples only - not as production quality. I cannot offer advice regarding any other c/c++ compiler/IDE or incompatibilities with VS. You are ultimately responsible for the effects of your programs and the integrity of the machines they run on. Anything I post, code snippets, advice, etc is licensed as Public Domain https://creativecommons.org/publicdomain/zero/1.0/ and can be used without reference or acknowledgement. Also note that I only provide advice and guidance via the forums - and not via private messages!
C++23 Compiler: Microsoft VS2022 (17.6.5)
-
August 15th, 2024, 12:54 PM
#6
Re: win32 - How to interrupt execution
Originally Posted by 2kaud
The 'cheat quick and dirty' way is to use PeekMessage() in the calculation loop and exit the calculation if required messages are in the message queue. This will slow down the calculation loop (probably substantially). But much better to do it 'properly' using a worker thread.
https://learn.microsoft.com/en-us/wi...r-peekmessagea
That is an idea. I could set a counter to send this message once for say every 500 cycles, say for a time of about one second. This would be a reasonable reponse time without too much burden in performance.
Thanks
N.A
-
Re: win32 - How to interrupt execution
Hi there!
I understand the challenge you're facing with handling long-running tasks in Fortran. One effective approach to allow for user interaction, such as clicking the cancel button, is to implement a separate thread for your lengthy evaluations. By doing so, you can keep your GUI responsive while the processing occurs.
**Links removed by Site Administrator so it doesn't look like you're spamming us. Please don't post them again.**
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|