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.
Gustav Seniormester
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
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?
13. januar 2021 - 15:33 #3
Forgot, Google is my friend.
Jeg prøver :-)
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.
Gustav Seniormester
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
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?
Gustav Seniormester
13. januar 2021 - 16:53 #7
Nej, så kan du bare pille åbning/lukning af formularen ud.
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.
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

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





Premium
IBM sætter flere navne på topledelsen for sit nye selskab 'NewCo'
Der er blevet sat navne på flere af de aboslutte topposter i IBM's nye driftsselskab, NewCo. Ind til videre fisker IBM inden for egne rækker.
Computerworld
Trump bønfalder Helle Thorning: Giv mig min Facebook-konto tilbage
Facebooks tilsynsråd, der har Helle Thorning-Schmidt i spidsen, har modtaget en erklæring fra Donald Trump, som ønsker at få genoprettet adgangen til sin Facebook og Instagram-konto.
CIO
Har du rost din mellemleder i dag? Snart er de uddøde - og det er et tab
Computerworld mener: Mellemledere lever livet farligt: Topledelsen får konstant ideer med skiftende hold i virkeligheden, og moden går mod flade agile organisationer. Men mellemlederen er en overset hverdagens helt med et kæmpe ansvar. Her er min hyldest til den ofte latterliggjorte mellemleder.
Job & Karriere
IBM Danmark trækker tilbud om frivillige fratrædelser tilbage for stort antal ansatte: "IBM har taget røven på sine ansatte"
Som led i IBM Danmarks store fyringsrunde fik 130 ansatte grønt lys til at forlade selskabet på en frivillig fratrædelsesordning. Men nu har IBM Danmark trukket det oprindelige tilbud tilbage for størstedelen af de ansatte.
White paper
Gør dine medarbejdere til et aktiv i sikkerhedsarbejdet
Vi glemmer hurtigt gode råd og sikkerhedskurser. Men sådan behøver det ikke at være. Moderne træning, opfølgning og simulationer skaber en sikkerhedsorienteret kultur, som minimerer risikoen for, at din virksomhed rammes af ødelæggende cyberangreb.