Avatar billede whoot Nybegynder
31. oktober 2009 - 19:05 Der er 24 kommentarer

Kan ikke skrive til form fra thread

Hej der ude!

Jeg sidder med et problem - jeg har netop skrevet mit program om, så jeg laver nogle regnearbejde i en thread, så min applikation ikke hænger sig imens.
Problemet er bare at resultaterne af dette regnearbejde ikke bliver skrevet i mine labels, progressbars osv. som de plejer!

Jeg har siddet og kigget lidt på .invokerequired, men det fik jeg ikke noget ud af, da det aldrig er true!

Jeg får ikke nogle fejl, der sker bare intet på min form!
Avatar billede erikjacobsen Ekspert
31. oktober 2009 - 19:28 #1
Kig her: http://msdn.microsoft.com/en-us/magazine/cc300429.aspx
Eller vis os din kode, gerne for et lille testprogram.
Avatar billede whoot Nybegynder
31. oktober 2009 - 19:36 #2
Hej,
Her er min kode:
[code]
Public Class FileUpload

    Private Const BOUNDARY As String = "MichaelMichael"
    Delegate Sub SetTextCallback()
    'Public Shared Sub Main(ByVal args As String())
    '    upload("http://localhost/upload.php", "C:\z.zip")
    ' End Sub
    Public Shared Sub upload()
        Dim url As String = "http://fakeachievement.com/upload.pl"
        Dim binfile As String = "C:\test.txt"
        Dim Myfilesize As Integer = FileHand.GetFileSize(binfile)
        Dim myprogress As Integer = 0
        Dim MyFileLink As String = ""
        Console.WriteLine("Uploading: " + Path.GetFileName(binfile))
        Dim req As HttpWebRequest = DirectCast(WebRequest.Create(url), HttpWebRequest)
        req.Method = "POST"
        req.ContentType = "multipart/form-data, boundary=" & BOUNDARY
        Dim post As New StreamWriter(req.GetRequestStream())
        post.WriteLine("--" & BOUNDARY)
        post.WriteLine("Content-disposition: form-data; name=""filename""; filename=""" & Path.GetFileName(binfile) & """")
        post.WriteLine("Content-type: application/octet-stream")
        post.WriteLine("Content-Length: " & (New FileInfo(binfile)).Length)
        post.WriteLine("Content-Transfer-Encoding: binary")
        post.WriteLine("")
        post.Flush()
        Dim binf As New FileStream(binfile, FileMode.Open)

        Dim b(10000) As Byte
        Dim n As Integer
        Dim sofar As Integer = 0
        n = binf.Read(b, 0, b.Length)
        Console.WriteLine("File size: " & Myfilesize / 1024 / 1024 & " megabytes")
        While n > 0
            post.BaseStream.Write(b, 0, n)
            sofar += n
            'Console.WriteLine(sofar & " - " & Myfilesize)
            myprogress = ((sofar / Myfilesize) * 100)
            'Console.WriteLine(myprogress)
            n = binf.Read(b, 0, b.Length)
        End While

        binf.Close()
        post.BaseStream.Flush()
        post.WriteLine()
        post.WriteLine("--" & BOUNDARY & "--")
        post.Close()
        Dim resp As HttpWebResponse = DirectCast(req.GetResponse(), HttpWebResponse)
        Dim sr As StreamReader = New StreamReader(resp.GetResponseStream())
        Dim fullresp As String = sr.ReadToEnd()
        MyFileLink = Trim(Replace(fullresp, Right(fullresp, 20), ""))
        Console.WriteLine(MyFileLink)
######HER VIL JEG GERNE SKRIVE TIL FORMEN#######
        Form1.lblLink.Text = MyFileLink
        sr.Close()
        Console.WriteLine("Response was: " & resp.StatusCode & " - " & resp.StatusDescription)
        If resp.StatusDescription = "OK" Then Console.WriteLine("Success!")
        resp.Close()
        Console.Read()
        Form1.myUploadProgress.Value = 0
    End Sub
End Class
[/code]
Avatar billede erikjacobsen Ekspert
31. oktober 2009 - 19:43 #3
Så skal du kigge på eksemplerne i linket - delegates er svaret på alle dine problemer ;)
Avatar billede whoot Nybegynder
31. oktober 2009 - 19:47 #4
Jeg har forsøgt mig med delegate, men uden held.
Er der nogen mulighed for at du kan vise mig et eksempel i vb.net? :)
Avatar billede erikjacobsen Ekspert
31. oktober 2009 - 19:53 #5
Jeg har ikke noget liggende, som jeg kan finde ... og sidder ikke ved en Windows maskine. Men der er sikkert eksempler på nettet.
Avatar billede arne_v Ekspert
31. oktober 2009 - 22:11 #6
Det må skulle være noget a la:

    Sub SetText(ByVal s As String)
        Form1.lblLink.Text = s
    End Sub
    Delegate Sub SetTextCallback(ByVal s As String)
    Public Shared Sub upload()
        ...
        Form1.lblLink.Invoke(New SetTextCallback(AddressOf SetText), New Object() { MyFileLink })
        ...
    End Sub
Avatar billede whoot Nybegynder
31. oktober 2009 - 22:24 #7
Hvis jeg skriver det du har foreslået, får jeg følgende fejl:

Invoke or BeginInvoke cannot be called on a control until the window handle has been created.
Avatar billede arne_v Ekspert
31. oktober 2009 - 22:26 #8
Er formen synlig når det kald sker ??
Avatar billede whoot Nybegynder
31. oktober 2009 - 22:32 #9
Jep :)
Avatar billede arne_v Ekspert
31. oktober 2009 - 22:55 #10
Og det form objekt du kalder på er det samme form objekt som det der er synligt ??
Avatar billede whoot Nybegynder
31. oktober 2009 - 23:03 #11
Jeg gør på intet tidspunkt noget usynligt, så ja det bør det :)
Avatar billede arne_v Ekspert
31. oktober 2009 - 23:10 #12
Det er altså ikke tilstrækkeligt.

            Dim mf As New MainForm
            mf.ShowDialog()

gør mf synlig, men hvis du et andet sted i koden laver:

Dim mf2 As New MainForm

saa har du en ikke synlig instans af MainForm
Avatar billede whoot Nybegynder
31. oktober 2009 - 23:37 #13
Ok. De eneste kald jeg laver, der har noget med selve formen at gøre, er:
Private Sub drgEnter(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles MyBase.DragEnter
        If e.Data.GetDataPresent(DataFormats.FileDrop) Then
            e.Effect = DragDropEffects.Copy
        End If
    End Sub
    Private Sub drgDrop(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles MyBase.DragDrop
        Dim filePaths As String() = CType(e.Data.GetData(DataFormats.FileDrop), String())
        Dim numDroppedFiles As Integer = 0
        'Dim filename As String = CType(e.Data.GetData(DataFormats.FileDrop), Array).GetValue(0).ToString()
        For Each filePath As String In filePaths

            Me.lstFiles.Items.Add(filePath)
            numDroppedFiles += 1
        Next filePath
        lblNumDroppedFiles.Text = numDroppedFiles

    End Sub
Avatar billede arne_v Ekspert
31. oktober 2009 - 23:42 #14
Hvor kommer Form1 fra i dit Invoke kald ?
Avatar billede whoot Nybegynder
31. oktober 2009 - 23:47 #15
Public Class FileUpload
  Public shared sub upload()
  Form1.lblLink.Invoke(New SetTextCallback(AddressOf SetText), New Object() {MyFileLink})
  end sub
end class

Det bliver kaldt der fra. Formen har sin egen class, form1
Avatar billede arne_v Ekspert
31. oktober 2009 - 23:53 #16
Men Form1 er en instans af en klasse ikke ?

Hvor bliver den instantieret ?
Avatar billede whoot Nybegynder
31. oktober 2009 - 23:56 #17
Jeg er ikke helt sikker på hvad du mener - skal jeg gøre noget i stil med:

Dim mf As New MainForm
            mf.ShowDialog()

Først?

Sorry jeg ikke er helt med, men jeg kender ikke alle de rigtige termer.. :)
Avatar billede arne_v Ekspert
01. november 2009 - 00:10 #18
Absolut ikke.

Men hvor kommer Form1 fra ?
Avatar billede whoot Nybegynder
01. november 2009 - 00:13 #19
Er ikke helt sikker på hvad du mener - den var der da jeg startede projektet :)
Avatar billede arne_v Ekspert
01. november 2009 - 00:19 #20
Kan du vise den kode hvor Form1 og lblLink defineres og initialiseres ?
Avatar billede whoot Nybegynder
01. november 2009 - 00:26 #21
Kan man overhovedet det i VB?
Jeg tror det bliver styret i det indbyggede 'designer mode'..?
Avatar billede arne_v Ekspert
01. november 2009 - 00:30 #22
Du kan godt finde den kode der bliver genereret i designer mode.
Avatar billede arne_v Ekspert
22. november 2009 - 04:10 #23
Kommet videre?
Avatar billede whoot Nybegynder
23. november 2009 - 08:17 #24
Hej arne,

Du må meget undskylde jeg pludselig stoppede med at svare, men jeg har været uden internet i et stykke tid nu! De er ikke så hurtige til at ordne folks internet her oppe i Sverige.. :(

Men ja, jeg fandt faktisk løsningen i en frokost pause, på arbejdet!
Poster senere, når jeg har adgang til koden.

Mange tak for din hjælp, det er vildt du har tid og overskud til at hjælpe så mange her inde :)
Og jeg vil endnu en gang undskylde, at jeg pludselig stoppede med at svare!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester