• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Soulsick

[VB08] Problema com o form usando threads, é erro ou é normal?

5 mensagens neste tópico

Boas,

estava aqui a fazer uns testes e a aproveitar para aprender a trabalhar com threads e acontece que quando o programa está a "ler" um ficheiro de texto (cerca de 9MB), o form que contem a progressbar se for mexido de lugar, ou até mesmo se colocar uma janela por cima, parece que fica congelada, ou seja inutilizável por assim dizer.

Eu recorri a outro form e a threads, para evitar que isto acontecesse no form principal e até fui bem sucedido lol :biggrin: só que agora acontece no form da progressbar.

Agora a duvida em si, isto é normal visto o ficheiro ser grande e as actualizações da progressbar serem muitas/constantes ou é algum erro de código?

deixo o código que tenho de momento, não liguem muito à desarrumação e provavelmente a algumas variaveis "soltas" e/ou inuteis, é só mesmo código de teste.

Imports System.IO
Imports System.Threading

Public Class Form1
    Dim reader As StreamReader
    Dim writer As StreamWriter
    Dim nlinhas As Long = 1
    Dim prog As New frm2
    Dim filename As String


    Private Sub btnProcurarFile_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnProcurarFile.Click
        btnProcurarFile.Enabled = False
        Dim thdLeficheiro As New Thread(AddressOf LeFicheiro)
        thdLeficheiro.IsBackground = True

        With Me.ofdFicheiro
            .FileName = Nothing
            .Filter = "Ficheiro de Texto (*.txt)| *.txt"
            .ShowDialog()
        End With

        Me.txtNomeFile.Text = Me.ofdFicheiro.FileName
        filename = Me.ofdFicheiro.FileName

        MsgBox(My.Computer.FileSystem.GetFileInfo(Me.ofdFicheiro.FileName).Length)
        prog.ProgressBar1.Maximum = My.Computer.FileSystem.GetFileInfo(Me.ofdFicheiro.FileName).Length
  
        thdLeficheiro.Start()
    End Sub

    Delegate Sub actualizaProgBarCallBack(ByVal val As Long)

    Public Sub actualizaProgBar(ByVal val As Long)
        prog.ProgressBar1.Value += val
    End Sub

    Private Sub chamaActualizaProgCallBack(ByVal valor As Long)
        Dim cb As New actualizaProgBarCallBack(AddressOf actualizaProgBar)
        Dim args() As Object = {valor}
        prog.Invoke(cb, args)
    End Sub

    Private Sub LeFicheiro()
        prog.Show()

        Dim tam As Byte
        Dim linha As String

        Dim reader As New StreamReader(filename)
        While Not reader.EndOfStream
            linha = reader.ReadLine()
            tam = linha.Length
            nlinhas += 1
            If Not reader.EndOfStream Then
                chamaActualizaProgCallBack(tam + 2)
            Else
                chamaActualizaProgCallBack(tam)
            End If
        End While
        MsgBox("job done!")
    End Sub
End Class

desculpem pelo post grande :D mas se me puderem elucidar ficaria agradecido.

cumps,

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Assim por alto, lanças a thread e na thread abres um form (onde está a progressbar), correcto ?

Dentro do ciclo While, do Sub LeFicheiro colocar lá um Application.DoEvents() no fim para experimentares.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim é isso. Ao colocar o Application.DoEvents() resolveu o problema :D mas o que faz isso ao certo?

Obrigado pela ajuda jpaulino!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim é isso. Ao colocar o Application.DoEvents() resolveu o problema :D mas o que faz isso ao certo?

Obrigado pela ajuda jpaulino!

Application.DoEvents() permite ao sistema operativo executar as suas mensagens (acções). Se não utilizares isso bloqueia.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora