Avatar billede Jørgen Kirkegaard Professor
12. januar 2021 - 19:27 Der er 7 kommentarer og
1 løsning

Wait 10 minutter med lavest brug af resurser (og et bonusønske)

Jeg har brug for at vente på at en begivenhed indtræffer. Jeg forestiller mig, at det bruger mange resurser at teste på Time() indtil der f.eks. er gået 10 minutter. Findes der en mindre resursekrævende mulighed? Eller er det hipsomhap, fordi alle Waits i princippet gør det samme?

Det er ok, hvis jeg skal kalde den fra Access til at køre f.eks. i DOS.

En lille lækker bonus vil være, hvis jeg kan kan break'e koden ved tryk på en tast.
Avatar billede Gustav Ekspert
12. januar 2021 - 20:17 #1
Du kan bruge API-kaldet til Sleep, fx som her i min time-out funktion i ModernBox:

' API call for sleep function.
#If VBA7 Then
    Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#Else
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If

' ....

        ' Record launch time and current time with 1/18 second resolution.
        LaunchTime = Date + CDate(Timer / SecondsPerDay)
        Do While CurrentProject.AllForms(FormName).IsLoaded
            ' Form FormName is open.
            ' Bring form to front; it may hide behind a popup form.
            DoCmd.SelectObject acForm, FormName
            ' Make sure form and form actions are rendered.
            DoEvents
       
            ' Halt Access for 1/20 second.
            ' This will typically cause a CPU load less than 1%.
            ' Looping faster will raise CPU load dramatically.
            Sleep 50
            If TimeOut > 0 Then
                ' Check for time-out.
                CurrentTime = Date + CDate(Timer / SecondsPerDay)
                If (CurrentTime - LaunchTime) * SecondsPerDay > TimeOut / 1000 Then
                    ' Time-out reached.
                    ' Close form FormName and exit.
                    DoCmd.Close acForm, FormName, acSaveNo
                    TimedOut = True
                    Exit Do
                End If
            End If
        Loop
        ' At this point, user or time-out has closed form FormName.


Du skal selvfølgelig have justeret de 50ms op til fx 600000. Eller fx i en ydre loop, hvor du checker for tastetryk.

Fuld kode og (link til) dokumentation her:
https://github.com/GustavBrock/VBA.ModernBox
Avatar billede Jørgen Kirkegaard Professor
13. januar 2021 - 15:28 #2
Tak! Sikke en klamamse!

Jeg kender ikke til Declare.
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Hvor har du "Sleep" fra?
Avatar billede Jørgen Kirkegaard Professor
13. januar 2021 - 15:33 #3
Forgot, Google is my friend.
Jeg prøver :-)
Avatar billede Jørgen Kirkegaard Professor
13. januar 2021 - 15:35 #4
Hvad er forskellen på dette og så inde i et VB sub/function blot at skrive Sleep 50, bortset fra muligheden for at trykke tast for at afbryde? Jeg vil gerne slippe for at skulle lave en form.
Avatar billede Gustav Ekspert
13. januar 2021 - 16:00 #5
Ved nærmere eftertanke, var det måske netop, hvad du skulle gøre.
Formularen er kun åben, så længe timeren kører, og vil man afbryde, lukker man formularen.

Det er jo lavet til min messagebox, som fungerer som en normal MsgBox, men med muligheden for at specificere et time-out i millisekunder. Sæt det til 60 * 10 * 1000, og den timer ud efter 10 min, hvis man ikke inden har trykket på en knap eller lukket formularen.

Du kan downloade demoen (v 1.3.1) og prøve:

MsgMox "Vent 5s eller tryk en knap.", vbInformation + vbOkOnlyButtons, "Demo", , , 5000
Avatar billede Jørgen Kirkegaard Professor
13. januar 2021 - 16:44 #6
Jeg kunne selvfølgelig prøve, men er der noget til hinder for ikke blot at lave det i en Sub/Function?
Avatar billede Gustav Ekspert
13. januar 2021 - 16:53 #7
Nej, så kan du bare pille åbning/lukning af formularen ud.
Avatar billede Jørgen Kirkegaard Professor
23. januar 2021 - 13:46 #8
Jeg har endnu ikke testet det, men det ser overbevisende ud og i tråd med tilsvarende løsninger på nettet.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester