Jag har ett program som loopar ut data från en databas och vid varje ny "post" från databasen kör jag en subrutin som gör massor med saker och som kallar flera subrutiner. Nu är det så att jag har byggt programmet med DoEvents loopar som ser ut så här: Förstår inte riktigt vad du "väntar på", är det en flertrådad applikation? I sådana fall kan du lägga in en sleep i loopen: [Pausa programexekvering] Annars får du gärna berätta mer om hur din applikation fungerar. Hur anropas koden du väntar på t.ex? Jag har flera olika subrutiner som körs efter varandra bland annat en CSocket och jag vill inte att loopen fortsätter förens den ska, alltså när CSocketen är klar mm. Vore det inte bättre att rapportera tillbaks med callback? Programmet loopar data från en databas vid varje "loop" eller varje "post" då jag får information från databasen så kör jag en subrutin som skapar en csocket och som gör olika saker när den connectat mm. och då om jag inte har någon DoEvents loop så fortsätter den loopa genom data från databasen direkt efter första subrutinen körts. Du behöver inte loopa recordsetet. Tackar, men mitt problem med CPUn löste sig med Sleep 1 efter DoEvents.Alternativ till så kallade idle loopar (DoEvents) ?
Do
DoEvents
Loop Until intKlar = 1
Den körs alltså innan RecordSet.MoveNext för att den inte ska loopa ut nästa post i databasen förens programmet kört klart allt den ska. Men nu är det så att mitt program tar upp till 100% av CPU kraften och jag har hört tidigare att DoEvents loopar inte är bra för just att det tar mycket CPU kraft men hur kan jag göra istället?Sv: Alternativ till så kallade idle loopar (DoEvents) ?
/JohanSv:Alternativ till så kallade idle loopar (DoEvents) ?
Det jag alltså vill vilket borde finnas altenrativ till är att den ska alltså vänta med att loopa tills variabeln intKlar = 1 för som jag har nu så sätter programmet intKlar = 1 när programmet ska fortsätta med loopen.
Det hela ska alltså fungera på samma sätt men DoEvents tar för mycket CPU.Sv: Alternativ till så kallade idle loopar (DoEvents) ?
Det är mycket svårt att ge dig feedback på dit problem om du inte förlarar vad du gör mer utförligt. Hur strukturen ser ut och varför du "måste" gör på ett sätt.
Det finns alltid flera sätt att lösa ett problem.
För att do loopen inte skall ta lika mycket resuser så kan du sleepa den ås som Johan Djupmarker förespråkar:
Option Explicit
Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
Private Klar As Boolean
Private Sub StartButton_Click()
Klar = False
Do
DoEvents
Sleep 1
Loop Until Klar
MsgBox "Slutförd!", vbInformation
End Sub
Private Sub StopButton_Click()
Klar = True
End Sub
Sv:Alternativ till så kallade idle loopar (DoEvents) ?
Men jag har då lagt in DoEvents loopen så att den inte fortsätter förens programmet kört alla delar jag vill.
Jag vet inte hur jag ska förklara bättre och jag kan itne ge ut koden då detta är ett lite större projekt. Men jag ska testa Sleep grejen efter DoEvents så får vi se.Sv: Alternativ till så kallade idle loopar (DoEvents) ?
1. Öppna ditt recordset och Skapar en CSocket
2. Anrop skicka rutin
2.1. Skicka kontrollera om recordsetet nåt EOF
2.1.1. I så fall anropar en upstädnings rutin som aktuell post
2.1.2. Annars utför din request(skickar iväg data och börja lysna efter data).
3. CSocket kontrollen rasiar event att data tagits emot.
3.1. Du anropar rutinen som bearbetar svaret
3.2. Anrop skicka rutin (2.1)
Om jag tolkat din struktur rätt.
Om du inte vill hålla en anslutning mot dina dabas kan du söka på Disconnected Recordset.Sv:Alternativ till så kallade idle loopar (DoEvents) ?