Hej Private Sub Command1_Click() Lätt svar: Trådar i vb 6 är livsfarligt. Går inte att köra i debuggern utan risk för att vb kraschar om någon ovänntat händer Vad är det du vill göra ? Hej Varför gör du inte en ny Form, med text som talar om att systemet är upptaget ? Kanske en ide. På den kanske jag kan ha en progressbar som tickar under tiden. Tja... Ja, du har uppfattat mitt problem rätt, men det finns väl ingen lösning på detta i VB6 Hittade en på : http://www.gimptalk.com/forum/topic.php?t=5086&start=1&tutorial-Animated-Progress-Bar.html#32922 Oskar skrev : Hmm...försökte just lägga ut den animerade progressbaren på en form. > Jag gör en egen lösning där jag låter en Label växa med DoEvents imellan. Kan inget om trådar och har nog inte någon anledning att läsa in det för detta projektet. Du måste ju förstå problematiken först. <b>Har sett en del program som har någonting som roterar men kan inte hitta vad det är</b> Alf, Hej igen Troligen är det snabbare att hämta "allt" och iterera över resultatet. Nej det gör jag troligtvis inte Använder du ADO? ADO stödje asynkrona fråge anrop. På så sät skulle du kunna animera istället för att den blockerar tråden. Nej, använder codebase egen databasmotor. Då är det något fel med din ursprungliga query. Det ska inte gå fyra gånger fortare att göra via kod, snarare tvärtom.Progressbar el liknande
Vill ha någon typ av aktivitetsvisare mer än timglaset när jag t.ex hämtar data från en databas
och inte vet vilka värden jag skall sätta på t.ex en progressbar. Har provat med timerkontrollen
men den aktiveras inte under själva datahämtningen utan förblir orörd.
Finns det någon lösning på detta ?Sv: Progressbar el liknande
ProgressBar1.Min = 1
ProgressBar1.Max = 100000
For a = 1 To 100000
ProgressBar1.Value = a
Next
End Sub
/MartinSv: Progressbar el liknande
Det går inte.
För att få något att hända under tiden du hämtar data måste du hämta data i en separat tråd. Tyvärr finns inget inbyggt stöd i VB6 för att skapa trådade applikationer. Om du googlar lite på "VB6 Threading" får du lite förslag på hur du ska göra, men det är inget enkelt. Jag har inte testat själv så jag vet inte hur väl det fungerar.
/JohanSv:Progressbar el liknande
Sv: Progressbar el liknande
Det går ju inte att hämta så mycket data att man måste ha en progressbar under tiden.
Vill du däremot visa progress under tiden du itererar över recordset går det utmärkt.
ex. (ur huvudet)
Select count * as NumberOfRecords from tabell
Progressbar1.min=1
Progressbar1.max=NumberOfRecords
Select * from Tabell
While not RecordSet.EOF
a=a+1
ProgressBar1.Value=a
Do_SomeThing
RecordSet.Next
WendSv:Progressbar el liknande
Använder codebase databas
Sätter ett Query anrop för att hämta ut viss data från databasen enligt urvalet
Detta kan ta lite lång tid för den som sitter och väntar och därmed börjas det
med att trycka på dom flesta tangenter för användaren tror att programmet hängt sig.
Anropet kan ibland ta 2 -3 minuter
Vill på något sätt upplysa användaren om att programmet inte har hängt sig utan det
är bara att vänta tills processen är klar.
Därfter vet jag hur många records som anropet gav och kan kan då sätta värden på progressbarenSv: Progressbar el liknande
Innan din Query : BusyForm.Load.
efter : Unload BusyForm.Sv:Progressbar el liknande
Går det ??
I så fall hur anropa den när query är klar ?Sv: Progressbar el liknande
Att uppdatera en progressbar i en loop eller liknande gör ju bara att processen tar ännu längre tid.
Kanske man kan hitta en animerad progressbar någonstans...typ Gif-bild ?
Jag förstår att du vill att det ska se ut som om det händer något i ditt gränssnitt och det gör det ju då.Sv:Progressbar el liknande
Sv: Progressbar el liknande
Bara lägg en PictureBox på din form och referera till den bilden. Jag antar att det är OK att använda den, eftersom den tillkommit på allmän begäran.Sv:Progressbar el liknande
<b>Trådar i vb 6 är livsfarligt.</b>
Nu tar du väl i. :-)
Jag gör en egen lösning där jag låter en Label växa med DoEvents imellan.Sv: Progressbar el liknande
Funkar inte.
Kan man inte lägga en Gif-bild i en picturebox i VB 6 ?Sv: Progressbar el liknande
Det är iofs. inte multitrådat..Sv:Progressbar el liknande
Kanske är det lättare att skriva om programmet i .NET ??
Här är i vilket fall min rad som tar c:a 4 minuter för att exekvera.
rc = relate4querySet(rel, "DAT>=STOD('" & FromDatum & "').AND.DAT<=STOD('" & TomDatum & "').AND.ARTNR<>' '")
Under tiden har jag idag ett timglas och en label som säger att programmet
hämtar data från databasen. Ville ha något som samtidigt visade att något händer.
Har sett en del program som har någonting som roterar men kan inte hitta vad det är Sv: Progressbar el liknande
Du skickar en atomär begäran till en extern grej, "Gör X". Databasen kommer göra "X" och hålla på med det tills den är klar. Om du skulle få tillbaka kontrollen under tiden så skulle inte resultatet finnas tillgängligt senare i samma sub/funktion.
Det enda sättet du kan göra är att ha två olika trådar, den ena arbetar med en databas, den andra med en animation. Antingen gör du detta manuellt, vilket kräver "äkta" trådning i VB, vilket (enligt ovan) är totalt livsfarligt, eller så måste du hitta någon sorts kontroll som själv startar en tråd som sköter sin animering. Det är inte omöjligt att det finns.
Att göra i .NET eller något annat språk ger ingen som helst skillnad, det är exakt samma problematik (förutom att det oftast är betydligt lättare att arbeta med trådar i andra språk).
Det finns ytterligare en variant som kan funka:
Jag förstår mig inte riktigt på din query, men om du kan göra den för en viss del av databasen först, och sen för lite mer, osv., så kan du göra en uppdatering mellan varje sådan delquery. Typ
<code>
i=0
step = 1000
do while more rows
i=i+step
sql("... WHERE ID <" & (i+step) & " AND ID > " & (i))
update graphics
loop
</code>Sv: Progressbar el liknande
Det är säkert program som jobbar med flera trådar. Eftersom programmet är upptaget med anropet till databasen kan den inte uppdatera grafiken under tiden i samma tråd.
<b>Kanske är det lättare att skriva om programmet i .NET ??</b>
Har du möjlighet att göra om programmet i .NET är det mycket enklare att göra databasanropet i en separat tråd. I 2.0 tror jag tom att det finns en kontroll som hjälper till med att uppdatera gränssnittet från rätt tråd.
/JohanSv:Progressbar el liknande
Bara en fundering...
En Query som tar flera minuter ?
Har du något index ?
På 4 minuter hinner man läsa 1000.000 -tals poster i en oindexerad textfil, försiktigt räknat.
Jag har en känsla av att det är lite "overkill" att snacka avancerade tråd-lösningar här. Jag tror att problemet finns på en mer grundläggande nivå .
Har du själv kontroll över den databas du vill läsa från ?Sv: Progressbar el liknande
Som jag nämnde ovan så är det alldeles för avancerat med trådar för detta projekt och varför frågan kom upp var för att jag har själv ibland upplevt att datorn har hängt sig när den i verkligheten fortfarande jobbar mot databasen. Efter alla inlägg i denna fråga så förstår jag att det är avancerat
Får nöja mig med att användaren inte börjar trycka esc eller avslut då datorn jobbar. Har ju timglas och
meddelande på skärmen om att data hämtas mm. Vad jag ev kan göra är att söka efger en animering som du nämner.
Det finns givetvis index i databasen men inget som plockar ut viss data enl mitt önskemål med alla ingående artiklar från fakturor mellan två olika datum.
Kanske snabbare att hämta alla artiklar i hela databasen och sedan loopa igenom dessa och bearbeta
de som uppfyller datumurvalet. Då vet jag ju hur många poster som finns och kan därmed sätta värden till progressbaren
Tack för alla olika svar på denna frågaSv:Progressbar el liknande
Jag testade just att läsa in 1,2 miljoner textrader, det tog c:a 3 sekunder...
Gör du väldigt mycket datamanupilationer i din query ?
Om det är så, kanske man kan tänka sig att göra detta i en separat periodisk körning ?Sv: Progressbar el liknande
Jag gör vad som krävs av CodeBase för att hämta data mellan ett datumintervall
Se sträng
rc = relate4querySet(rel, "DAT>=STOD('" & FromDatum & "').AND.DAT<=STOD('" & TomDatum & "').AND.ARTNR<>' '")
DAT=fältet i databasen
FromDatum och TomDatum är vanliga datumformat "CCYY-MM-DD"
STOD är en intern databasfunction som står för att konvertera ett datum till databasens format vilket är "CCYYMMDD"
.AND.ARTNR<>' ' står för att jag inte vill ha med artiklar som saknar artikelnr
Skall prova att ta att ta bort STOD functionen till följande
rc = relate4querySet(rel, "DAT>='"20061201"'.AND.DAT<='"20061230'".AND.ARTNR<>' '") Sv:Progressbar el liknande
Kan du visa ditt anrop?Sv: Progressbar el liknande
Här är Queryn till databasen
rc = relate4querySet(rel, "DAT>=STOD('" & FromDatum & "').AND.DAT<=STOD('" & TomDatum & "').AND.ARTNR<>' '")
Jag löser det genom att inte använda detta anrop utan istället öppna hela tabellen med ett index och sedan loopa igenom hela tabellen och bearbeta records som uppfyller mitt villkor så här:
rc=d4top(db)
While rc = r4success
Datum = f4str(d4field(db, "DAT"))
ArtNr = f4str(d4field(db, "ARTNR"))
If Datum >= FromDatum And Datum <= TomDatum And Trim(ArtNr) <> "" Then
Bearbetar recordet .......
End if
rc=d4skip(db,1)
LoopSv:Progressbar el liknande