Styra en ProgressBar i form1 från separat tråd (visual Basic)

Permalänk
Medlem

Styra en ProgressBar i form1 från separat tråd (visual Basic)

Hej

Yttligare en dum fråga, jag har en startform med lite knappar och en progressbar.
När jag trycker på knappen START så drar en funktion igång i en ny tråd, jag vill sedan successivt öka progress baren från tråden, detta har visat sig svårare än vad jag trott.

Exempel

Public Class Form1 Dim helper As New help_functions Dim progressbar1 As New ProgressBar Private Sub START_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles START.Click Dim StartThread As Thread = New Thread(AddressOf my_function) StartThread.Start() End Sub Public Sub my_function() helper.func1() End Sub End Class Public Class help_functions Public Sub func1() For i As Integer = 0 To 100 'Göra saker 'Öka progressbar1 med 1 Next End Sub End Class

Problemet är alltså att jag inte får tillträde till progressbar1 via tråden, får typ cross thread error eller något liknande.. har försökt med handels och events men inte lyckats, antar dock att det är så man måste göra.

Så det jag undrar är, hur skapar jag ett event i lopen som kan uppfattas utanför och i en annan tråd?

har försök att deklarera och placera ut evnten på lite olika ställen utan att lyckas :/

Permalänk
Medlem

Hej. Kom ihåg att jag skrev ihop ett exempel på hur man hanterar GUI Controls från andra trådar något år sedan. Exemplet är i C# men det ska nog gå att översätta det du behöver.

I stort sett måste du använda kolla .InvokeRequired för att sedan anropa .Invoke på kontrollen du ska uppdatera.

#8349729

Permalänk
Medlem

BackgroundWorker kan vara värd att kika på.

Permalänk
Medlem

Som ovan så skulle jag tippa på invoke, lite klurigt att förstå i början tyckte jag i c#, bör va liknande till VB tycker man. Hade flertrådat som dej när jag skrev en autobot för ett onlinespel och ville då rapportera viss info till maintråden.

Permalänk
Skrivet av Dalton Sleeper:

Som ovan så skulle jag tippa på invoke, lite klurigt att förstå i början tyckte jag i c#, bör va liknande till VB tycker man. Hade flertrådat som dej när jag skrev en autobot för ett onlinespel och ville då rapportera viss info till maintråden.

Har använt mig av det här sättet men som ovan skulle jag nog rekommendera en backgroundworker som tar hand om det här

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem

Okej tack för tipsen, ska ge mig på backgroundworkern och se om jag lyckas få till det, försökte använda den för ett tag sen sär jag började kika på trådar men fick det aldrig att fungera

Permalänk
Medlem

Funkar det inte att skicka med en callback-metod till din tråd som anropas när progressbaren behöver uppdateras?

Nu har jag inte pysslat så mkt med VB utan bara C# men har gjort en sån lösning där och det fungerar fint

Permalänk
Medlem
Skrivet av Phoz:

Funkar det inte att skicka med en callback-metod till din tråd som anropas när progressbaren behöver uppdateras?

Nu har jag inte pysslat så mkt med VB utan bara C# men har gjort en sån lösning där och det fungerar fint

Hur menar du? Exempel? Om man har skapat baren i en tråd och vill komma åt den från en annan så är det förbjudet med valiga metoder, om du menar callback som i vanlig metod?

Permalänk
Medlem
Skrivet av Dalton Sleeper:

Hur menar du? Exempel? Om man har skapat baren i en tråd och vill komma åt den från en annan så är det förbjudet med valiga metoder, om du menar callback som i vanlig metod?

Jag menar att om man har en progressbar i sitt GUI och startar en tråd som ska utföra nånting så kan man skapa en delegat och skicka med för att peka på callback-funktionen som ska anropas.

public delegate void ProgressCallback( int value ); private void MyCallback( int value ) { if( InvokeRequired ) { BeginInvoke( new ProgressCallback( Work_Callback ), new object[] { value } ); return; } progressBar.Value = value; } ...

Och ifrån tråden (som ej är samma som GUI-tråden)

private void WorkerMethod( ProgressCallback callback ) { for( int i = 0; i < 100; i++ ) { callback( i ); Thread.Sleep( 40 ); } }

Typ så.

Permalänk
Medlem

då fattar jag, trodde inte du skulle köra med delegate och invoke utifrån din första post så...

Permalänk
Medlem
Skrivet av Dalton Sleeper:

då fattar jag, trodde inte du skulle köra med delegate och invoke utifrån din första post så...

Jaja att förklara saker för andra är inte riktigt min grej, speciellt inte när jag är lite eftermiddags-trött på jobbet

Permalänk
Medlem

Tack för hjälpen, lyckades fixa det med en BackgroundWorker

Nu har jag dock stött på ett anat inte lika trevligt problem, sitter på en vista maskin och skriver samt kompilerar koden, sedan vill jag kunna köra programet även på en xp dator men får access denied

har lyckats hitta vad det beror på men fattar inte hur man ska lösa det!

Problemet är tydligen när man försöker skriva från en egenskapad tråd, den har på något sätt en längre Access vektor i vista än i xp och feltolkas således av xp datorn vilket leder till access denied

Så här står det i hjälpen från visual studio

THREAD_ALL_ACCESS: All possible access rights for a thread object. Windows Server 2003 and Windows XP/2000: The value of the THREAD_ALL_ACCESS flag increased on Windows Server 2008 and Windows Vista. If an application compiled for Windows Server 2008 and Windows Vista is run on Windows Server 2003 or Windows XP/2000, the THREAD_ALL_ACCESS flag contains access bits that are not supported and the function specifying this flag fails with ERROR_ACCESS_DENIED. To avoid this problem, specify the minimum set of access rights required for the operation. If THREAD_ALL_ACCESS must be used, set _WIN32_WINNT to the minimum operating system targeted by your application (for example, #define _WIN32_WINNT _WIN32_WINNT_WINXP). For more information, see Using the Windows Headers.

Hela avsnittet finns här: Thread Security and Access Rights (Windows)

Någon som har stött på detta förut och vet hur man ändra på THREAD_ALL_ACCESS?