Hej i loopen lägger du in kommandot DoEvents. Det gör att operativsystemet får några millisekunder över att uppdatera skärmen. Räcker inte det kan du även skriva textbox1.refresh - men det skall inte behövas. Eller prova det här. ok, tackar DoEvent funkar. Prestandan påverkas självklart väldigt negativt. om du vill ta reda på exakt hur mycket så kan du ju använda anropet getTickCount innan körningen och sen igen efter körningen. på det sättet kan du se hur många millisekunder körningen tagit, och därigenom ta reda på hur prestandan påverkas av att du använder DoEvents().. Skulle vara intressant om du ville göra en studie på detta ex. Självklart tar det längre tid, DoEvents låter operativsystemet utföra kommandon som köats... En kompromiss kan vara att köra DoEvents var hundrade eller tusende varv: Det är ju ett konstigt problem.Varför skall man uppdatera Text1.Text Ett tips som inte riktigt har med detta att göra men väl Sven, varför ska du ha med sleep? Det tar ju bara längre tid... Din lösning utan sleep borde vara den optimala... Anledning till att han har Text1.Text i loopen är att han vill se hur Hejuppdatering av textruta
Ett kanske enkelt problem som jag inte kan lösa:
hur uppdaterar man en textruta frekvent? Dvs Jag använder koden nedan och vill se hur många varv loopen har körts. (den tar lååång tid så det är intressant)
den skriver bara ut, dvs uppdaterar så att jag ser det, ibland. Serien kan bli 1 56 149 osv.
Jag vill att den visar åtminstone varje sekund. Rör jag musen uppdateras det hela tiden.
Kan man göra detta med någon timer funktion eller något liknande.
<code>
do
..
text1.text = i
..
..
loop while i < 10 000
</code>
\jonasSv: uppdatering av textruta
Sv:uppdatering av textruta
do
..
text1.text = i
text1.Refresh
..
loop while i < 10 000Sv: uppdatering av textruta
Vet någon hur ett sådant kommando påverkar prestandan. Det borde ju rimligt innebära att körningen tar ännu längre tid. Eller?
\jonasSv:uppdatering av textruta
BSv: uppdatering av textruta
<code>
Option Explicit
Private Declare Sub Sleep Lib "kernel32" _
(ByVal dwMilliseconds As Long)
Private Sub Command1_Click()
Dim i As Long
Do Until i >= 10000
i = i + 1
If i Mod 100 = 0 Then
Text1.Text = i
DoEvents
Sleep (200) '0.2 sek
End If
Loop
End Sub
</code>Sv:uppdatering av textruta
do
..
text1.text = i
if i mod 1000 = 0 then
DoEvents
End if
..
..
loop while i < 10 000
/Johan
Sv: uppdatering av textruta
när man ändå inte hinner se ändringarna.
Tex. 10000 körningar med DoEvents går så snabbt att det bara blir en läsning.
Min lösning med Sleep(200) är väl en rimlig lösning på problemet.Sv:uppdatering av textruta
när man vill snabba upp loopar men ändå ha med ett DoEvents.
[DoEvents i Loop:ar]Sv:uppdatering av textruta
/JohanSv: uppdatering av textruta
loopen utvecklas.När jag kör utan Sleep så går det så snabbt så man
ser bara ett resultat nämnligen 10 000 då är vitsen med att ha Text1
med i loopen borta.Iofs är hela lösningen med en TextBox i loopen
inte bra,vill man se utvecklingen är en ProgressBar bättre.
Men Ok Vi ser inte hela hans kod i loopen,det finns kanske en trög
broms i slingan då skall han givetvis inte ha med Sleep.
Synd att han inte har vett att svara hur det gick sedan !Sv:uppdatering av textruta
Nu är det inte så att jag inte har vett att svara utan inte hjunnit med utan sysslat med annat några dagar.
Eftersom Åke inte förstod problemet riktigt så kommer ett klargörande:
Inuti loopen hämtas ett antal celler ur olika excel-ark och datan bearbetas. Jag skriver ut vilken rad som bearbetas eftesom jag framför allt vill se att körningen går frammåt och inte har hängt sig. Varje varv i loopen tar ca 0.3 sekunder.
Med doEvents så skrivs radnummer i den takt att man hinner läsa stigande nummer ungefär som en snabbt tickande klocka.
Jag har gjort en körning på 1500 rader (tar ca 3-4 min) och ser ingen större skillnad med DoEvents. Därför har jag inte testat någon annan variant.
\jonas