locked
Form trava ao carregar secoes ini RRS feed

  • Pergunta

  • Ola

    Meu código a baixo carrega um arquivo file1.txt contendo diversas seções e parâmetros:

    Dim sectionName As String = String.Empty Using reader As New StreamReader(Application.StartupPath & "\file1.txt") While Not reader.EndOfStream Dim line As String = reader.ReadLine If line.StartsWith("[") AndAlso line.EndsWith("]") Then sectionName = line.Substring(1, line.Length - 2) Dim Assinatura = LerIni(filename, sectionName, "signature", "NotFound") '< demora Dim ep_only = LerIni(filename, sectionName, "ep_only", " ") 'para .text Dim nome As New ListViewItem(" ")

    Dim AA = textbox1.text Dim match As Match = Regex.Match(AA, Assinatura, RegexOptions.IgnoreCase) If match.ToString.Replace(" ", "").Length > 10 Then ListView1.Items.Add(nome) nome.SubItems.Add(sectionName) nome.SubItems.Add(ep_only) nome.SubItems.Add(Assinatura) End If End If End While End Using

    No ini contem dados como:

    [Nome 1]
    signature = AAAAAAAAAAAAAAAAAaaa
    ep_only = true
    
    [Nome 2]
    signature = BBBBBBBBBBBBBB
    ep_only = true
    Em "sectionName" eu extraio os nomes das seções, carrego com LerIni os parâmetros usando as seções extraídas e adiciono em um listview em colunas se contem a sectionName em meu textbox.


    Ate ai tudo bem, mas o programa trava enquanto carrega:

     Dim Assinatura = LerIni(filename, sectionName, "signature", "NotFound") '< demora

    segunda-feira, 24 de agosto de 2015 17:08

Respostas

  • Olá Eliseu, não é a variável splittedLine, é a variável line.
    • Marcado como Resposta Marcos SJ sexta-feira, 23 de outubro de 2015 17:58
    quinta-feira, 10 de setembro de 2015 19:29

Todas as Respostas

  • Bom dia,

    Tudo bem?

    No momento do travamento, de que maneira o sistema se comporta? existe alguma mensagem de erro gerada?

    Atenciosamente


    Marcos Roberto de Souza Junior

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    terça-feira, 25 de agosto de 2015 13:06
  • Olá

    Nenhuma mensagem de erro aparece, apenas o formulário trava até carregar os dados em:

    Dim Assinatura = LerIni(filename,  sectionName, "signature", "NotFound")
    • Editado Eliseu5 quarta-feira, 26 de agosto de 2015 02:13
    terça-feira, 25 de agosto de 2015 17:06
  • Posta como é seu Método LerIni

    Bruno Ferreira de Souza
    MVP - Microsoft Valuable Professional
    MCTS .NET Framework - Windows Applications
    MCPD .NET Framework - Windows Applications
    www.maestrodotnet.com.br
    @BrunoMaestro

    quarta-feira, 26 de agosto de 2015 02:20
  • Module modINI
        Private Declare Unicode Function WritePrivateProfileString Lib "kernel32" _
      Alias "WritePrivateProfileStringW" (ByVal lpApplicationName As String,
      ByVal lpKeyName As String, ByVal lpString As String,
      ByVal lpFileName As String) As Integer
    
        Private Declare Unicode Function GetPrivateProfileString Lib "kernel32" _
        Alias "GetPrivateProfileStringW" (ByVal lpApplicationName As String,
        ByVal lpKeyName As String, ByVal lpDefault As String,
        ByVal lpReturnedString As String, ByVal nSize As Integer,
        ByVal lpFileName As String) As Integer
    
        Public Sub SalvarIni(ByVal iniFileName As String, ByVal Section As String, ByVal ParamName As String, ByVal ParamVal As String)
            Dim Result As Integer = WritePrivateProfileString(Section, ParamName, ParamVal, iniFileName)
        End Sub
    
        Public Function LerIni(ByVal IniFileName As String, ByVal Section As String, ByVal ParamName As String, ByVal ParamDefault As String) As String
            Dim ParamVal As String = Space$(1024)
            Dim LenParamVal As Long = GetPrivateProfileString(Section, ParamName, ParamDefault, ParamVal, Len(ParamVal), IniFileName)
            LerIni = Left$(ParamVal, LenParamVal)
        End Function
    End Module

    quarta-feira, 26 de agosto de 2015 03:06
  • Olá

    Alguém? Alguma ideia? Ainda não consegui resolver...

    terça-feira, 1 de setembro de 2015 03:27
  • Tenta usar o código igual está nesse Exemplo

    Bruno Ferreira de Souza
    MVP - Microsoft Valuable Professional
    MCTS .NET Framework - Windows Applications
    MCPD .NET Framework - Windows Applications
    www.maestrodotnet.com.br
    @BrunoMaestro

    terça-feira, 1 de setembro de 2015 03:32
  • Olá Eliseu5, por acaso o arquivo é muito grande? Qual o tamanho para ser mais exato?
    quarta-feira, 2 de setembro de 2015 02:42
  • Olá

    1.230 kB mas aumenta porque pode-se adicionar mais itens.

    Meu objetivo é ler o código hexadecimal de um arquivo e comparar com os códigos de todas as seções contidos em "signature" em meu ini. Cada código encontrado é exibido em um listview junto com "ep_only" e o nome da seção.

    Talvez tenho uma forma mais prática/rápida mas não consegui formar. :/

    • Editado Eliseu5 quinta-feira, 3 de setembro de 2015 11:57
    quinta-feira, 3 de setembro de 2015 11:32
  • Olá Bruno

    Agradeço pela ajuda, testei o código mas ainda trava. :/

    • Editado Eliseu5 quinta-feira, 3 de setembro de 2015 11:41
    quinta-feira, 3 de setembro de 2015 11:32
  • Eliseu, existem dois arquivos: file1.txt e o arquivo ini (seu nome está armazenado na variável filename)

    Qual o tamanho dos dois?

    Tente depurar e por um breakpoint logo após o bloco Using do reader e veja se o código executa rápido ou devagar.

    Última dica: É recomendado usar XML em vez de INI.

    quinta-feira, 3 de setembro de 2015 17:52
  • Olá

    filename e file1.txt são o mesmo arquivo. Só que em file1.txt ele extrai o nome das seções "[secao]" e na variavel filename extrai a assinatura "signature". Na realidade o arquivo é carregado duas vezes, em "StreamReader" e depois pelo ini. Hnn, e talvez seja um dos motivos que trava, não tinha me tocado. Mas e como abrir só uma vez se eu preciso dos dois (StreamReader + LerINI)?

    Quanto ao XML, é uma boa dica, só que o arquivo INI em que eu uso é de terceiros, então não compensa ta convertendo toda vez que ele é atualizado.

    segunda-feira, 7 de setembro de 2015 19:32
  • Olá Eliseu, analizando o código, o uso do StreamReader não é necessário. Você pode usar o métodos LerIni direto.

    Se o seu problema é "não saber os nomes das seções", eu recomendo criar o seu próprio leitor de INI só com o StreamReader.

    • Editado Guilherme L. Santos terça-feira, 8 de setembro de 2015 05:59
    • Marcado como Resposta Eliseu5 quarta-feira, 9 de setembro de 2015 15:48
    • Não Marcado como Resposta Eliseu5 quarta-feira, 9 de setembro de 2015 15:48
    terça-feira, 8 de setembro de 2015 05:57
  • Olá

    Olha, demorei muuito pra conseguir um código para encontrar o nome das seções. Já tentei criar um leitor INI personalizado mas não consegui. :/

    quarta-feira, 9 de setembro de 2015 15:52
  • Olá Eliseu,

    Tudo bem?

    Gostaria de saber se a pergunta inicial já foi respondida.

    Atenciosamente


    Marcos Roberto de Souza Junior

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    quarta-feira, 9 de setembro de 2015 16:06
  • Olá Marcos,

    Não, não foi respondida pois eu continua com o problema sem solucionar, motivo ao qual fiz a pergunta.

    quarta-feira, 9 de setembro de 2015 16:56
  • Olá eliseu,

    Eu perguntei, pois é muito comum que o usuário que faz uma pergunta e recebe a resposta apropriada, continue desenvolvendo perguntas quando na verdade a pergunta inicial já foi respondida. Por exemplo:

    - "Quanto é 1+1?"

    -1+1=2

    - "Mas e se eu dividir isso por 2?"  ou por exemplo "Eu não conheço este sinal '='."

    E assim por diante.

    Eu entendo claramente porque fez a pergunta, você fez a pergunta porque você tem uma dúvida. 

    Se a pergunta inicial foi respondida a thread precisa ser fechada, independente se o usuário tem outros problemas relacionados a pergunta dele. Em casos assim a thread precisa ser fechada com a  marcação da resposta. Obrigado por seu retorno, assim que algum usuário encontrar a resposta para o seu problema, por gentileza, marque a resposta para que a thread possa ser fechada.

    Obrigado.

    Atenciosamente


    Marcos Roberto de Souza Junior

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.




    • Editado Marcos SJ quarta-feira, 9 de setembro de 2015 18:56
    quarta-feira, 9 de setembro de 2015 17:11
  • Ok :)

    quarta-feira, 9 de setembro de 2015 18:26
  • Olá Eliseu. Bom, faz um booooom tempo que não programo em VB, mas tentei criar um leitor de Ini pra você:

    Public Class IniSection
        Public Property SectionName As String
        Public Property Values As Dictionary(Of String, String)
    
        Public Sub New(name As String)
            SectionName = name
            Values = New Dictionary(Of String, String)
        End Sub
    
        Public Sub AddValue(key As String, val As String)
            If Values.ContainsKey(key) Then
                Values(key) = val
            Else
                Values.Add(key, val)
            End If
        End Sub
    End Class

    Using reader As New StreamReader(Application.StartupPath & "\file1.txt")
        Dim sections As New List(Of Sections)
        Dim section As IniSection = Nothing
        
        While Not reader.EndOfStream
            Dim line = reader.ReadLine()
    
            If Not String.IsNullOrWhiteSpace(line) Then
                If line(0) = "[" AndAlso line(line.Length - 1) = "]" Then
                    If section IsNot Nothing Then
                        sections.Add(section)
                    End If
                
                    section = New IniSection(line.Substring(1, line.Length - 2))
                Else
                    Dim splittedLine = line.Split("=")
    
                    Dim key = splittedLine(0)
                    Dim val = splittedLine(1)
    
                    section.AddValue(key, val)
                End If
            End If
        End While
    End Using

    Fiz de cabeça então pode haver algum erro de sintaxe. Mas espero que você pegue o conceito :)

    quarta-feira, 9 de setembro de 2015 19:07
  • Olá Guilherme

    Agradeço muito pela ajuda...

    1 - Esta dando erro em "sections" >>>> Dim sections As New List(Of sections): 

    Erro: Type sections is not defined.

    2-Para extrair a seção uso dai digamos apenas "textbox1.text = section" ?

    quarta-feira, 9 de setembro de 2015 22:37
  • Opa, perdão, vacilo meu :) O correto é:

    Dim sections As New List(Of IniSection)

    Você pode iterar sobre a lista e ver todas as seções carregadas e suas respectivas chaves

    For Each section As IniSection In sections
        MsgBox("Mostrando chaves da seção " & section.SectionName)
    
        For Each par As KeyValuePair(Of String, String) In section.Values
            MsgBox("key = " & par.Key & " | Value = " & par.Value)
        Next
    Next

    quinta-feira, 10 de setembro de 2015 00:15
  • Hnn, ok, entendi..

    Guilherme, agora da erro em " Dim val = splittedLine(1)" >> "O índice estava fora dos limites da matriz."

    Hn, se possui erro entre colchetes das seções (ex.: se nao fecha ou tem mais de um que fecha ou abre), retorna erro, não da so pra ignorar digamos? ou implica em todo codigo?


    • Editado Eliseu5 quinta-feira, 10 de setembro de 2015 01:03
    quinta-feira, 10 de setembro de 2015 00:33
  • Olá Eliseu, quando este erro acontecer denovo, passe seu mouse sobre a variável 'line' e poste o conteúdo dela.

    quinta-feira, 10 de setembro de 2015 01:03
  • Olá

    Segue erro:

    Acredito que seja por causa de colchetes a mais ou a menos no ini, mas deveria ignorar pegando apenas os colchetes do inicio e do fim, ignorando se tiver mais no meio. Ex.: [Passaro [aguia]].

    Além disso ele deixa sempre de fora a ultima secao, exibe todas menos a ultima.


    • Editado Eliseu5 quinta-feira, 10 de setembro de 2015 15:32
    quinta-feira, 10 de setembro de 2015 14:22
  • Olá Eliseu, não é a variável splittedLine, é a variável line.
    • Marcado como Resposta Marcos SJ sexta-feira, 23 de outubro de 2015 17:58
    quinta-feira, 10 de setembro de 2015 19:29
  • Boa tarde,

    Por falta de retorno do usuário, esta thread será encerrada.

    Caso seja necessário, por gentileza, abra uma thread nova.

    Atenciosamente

    Marcos Roberto de Souza Junior

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    sexta-feira, 23 de outubro de 2015 17:58