Hej! Testa att lägga till "Application.DoEvents" mellan varje varv i loopen (eller allra helst så ofta som möjligt). Det du helst ska göra är att köra funktionen i en egen tråd och därifrån uppdatera din progressbar. Hr nu inget exempel att ge dig direkt, men sök på Threading så hittar du säkert många exempel. Ja det är klockrent!Funktion, ändra storlek på bild
Jag har skrivit ett litet program som ska ändra storlek på ett gäng bilder. Problemet är
att det fungerar jättebra så länge bilderna inte är större än ca 1 MB. En och en går det
jättebra men om jag loopar min funktion så reagerar min ProgressBar kanske de 10
första gångerna sedan låser sig programmet tills allt är klart. Det kommer alltså till liv
igen när alla bilder är förminskade.
Finns det något i denna funktionen som skulle kunna ändras för att programmet inte ska
låsa sig? Testade att tråda funktionen men det blev bara sämre..
Public Function SavePicture(ByVal File As String, ByVal FileName As String) As Boolean
Try
If Advanced Then
sizeWillBeX = x.Value
sizeWillBeY = y.Value
Else
cb.Focus()
End If
If InStr("gif png jpg jpeg bmp", ext) = 0 Then
If Not Advanced Then
Me.TopMost = False
MsgBox("Det går inte att ändra storlek på " & filen & ", endast GIF JPG BMP och PNG tillåts!", MsgBoxStyle.Critical, "Gick inte ändra storlek")
Me.TopMost = True
Else
info.Items.Add("Fel: Filformat ej godkänt - " & FileName)
End If
pb.Value = 0
Exit Function
End If
Dim bm As New Bitmap(File)
Dim oldWidth As Integer = bm.Size.Width
Dim oldHeight As Integer = bm.Size.Height
pb.Value = 40
Dim Width As Integer
Dim Height As Integer
If keepAspectRatio Then
If (oldWidth > sizeWillBeX Or oldHeight > sizeWillBeY) Then
If (oldWidth >= oldHeight) Then
Width = sizeWillBeX
Height = oldHeight * (sizeWillBeX / oldWidth)
Else
Width = oldWidth * (sizeWillBeY / oldHeight)
Height = sizeWillBeY
End If
Else
Width = oldWidth
Height = oldHeight
End If
Else
Width = sizeWillBeX
Height = sizeWillBeY
End If
Dim thumb As New Bitmap(Width, Height)
Dim graph As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(thumb)
graph.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
graph.DrawImage(bm, New Rectangle(0, 0, Width, Height), New Rectangle(0, 0, bm.Width, bm.Height), GraphicsUnit.Pixel)
graph.Dispose()
pb.Value = 50
Try
Dim ff As New System.IO.FileInfo(s & FileName)
If ff.Exists Then
If Not Advanced Then
Me.TopMost = False
MsgBox("Filen" & filen & " finns redan. Byt namn på den!", MsgBoxStyle.Critical)
Me.TopMost = True
Else
info.Items.Add("Fel: Filen finns redan i målmappen")
End If
pb.Value = 0
Exit Function
Else
If ext = "jpg" Or ext = "jpeg" Then
thumb.Save(s & FileName, System.Drawing.Imaging.ImageFormat.Jpeg)
ElseIf ext = "gif" Then
thumb.Save(s & FileName, System.Drawing.Imaging.ImageFormat.Gif)
ElseIf ext = "bmp" Then
thumb.Save(s & FileName, System.Drawing.Imaging.ImageFormat.Bmp)
ElseIf ext = "png" Then
thumb.Save(s & FileName, System.Drawing.Imaging.ImageFormat.Png)
End If
End If
Catch ex As Exception
End Try
pb.Value = 80
bm.Dispose()
pb.Value = 90
thumb.Dispose()
pb.Value = 100
If Advanced Then
info.Items.Add("Filen " & FileName & " ändrades.")
End If
pb.Value = 0
Catch ex As Exception
If Advanced Then
info.Items.Add("Det gick inte att hantera filen.")
Else
MsgBox("Ogiltigt filformat!", MsgBoxStyle.Critical)
pb.Value = 0
End If
End Try
End FunctionSv: Funktion, ändra storlek på bild
/JohanSv: Funktion, ändra storlek på bild
Anledningen till att allting fryser till är att funktionen tar upp all processortid och ger inte det grafiska gränssnittet tid att rita om. Man kan göra det med Application.DoEvents som föreslagits, men det är både "snyggare" och troligen mer vanligt att man gör det i en egen tråd.
Ett poblem du kan stöta på är att uppdatera kontrollen från en annan tråd än huvudtråden, men det går att fixa. På kontrollen finns en funktion som heter Invoke, med vilken du kan sätta egenskaper från andra trådar.Sv: Funktion, ändra storlek på bild
Hade ingen aning om att man kunde använda Application.DoEvents till detta. Har
3-5 projekt som ligger på is för att de inte uppdaterar som de ska... :D :D
Men jag kör ändå trådat så mycket jag kan, fick inte till det idag dock..
Tack så mycket!!
Kodar vidare....