Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Entre para seguir isso  
mazzotti

[Ajuda VB.net] Pausando uma funcao

Recommended Posts

To usando essa funcao

Private Sub TypingEffect(ByRef msg As String)
Dim msgLen As Short
Dim currIndex As Short
Dim currChar As String
Dim currText As String
msgLen = Len(msg)
Do While currIndex <= msgLen
System.Windows.Forms.Application.DoEvents()
currIndex = currIndex + 1
currChar = Mid(msg, currIndex, 1)
currText = currText & currChar
Label1.Text = currText
System.Windows.Forms.Application.DoEvents()
Thread.Sleep(150)
Loop
End Sub

e

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
if Button2.text = "Pause then
Button2.text = "Continuar"
[B]Aqui ta meu problema..como eu faco pra da um pause nessa funcao?[/B]
else if Button2.text = "Continuar" then
[B]E dps continuar aqui[/B]
else
Label1.Text = Nothing
Dim reader As New StreamReader("c:\a.txt", System.Text.Encoding.Default)
Button2.text = "Pause"
end if
End Sub

Compartilhar este post


Link para o post
Compartilhar em outros sites

A sua ideia é pausar a função "TypingEffect" certo?

Você pode fazer isso executando ela em uma thread separada (veja a classe System.Threading.Thread), essa classe tem as funções "Suspend" e "Resume" que fazem o que você quer, elas não são muito seguras... Mas servem para esse tipo de aplicação simples.

ps: Com o Sleep pode tirar esses DoEvents ai.

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • Opa mano obrigado pela ajuda..tipo..se sabe algum outro jeito que eu posso usar pra tar um intervalo entre as letras q ele vai digita? o que usando Thread.Sleep() ele da "Sleep" no aplicativo todo =/

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    O Sleep só deveria dar o "Sleep" na thread que ele ta rodando, por isso executar a função em outra thread ajuda...

    Mas sim, tem um outro jeito que é até melhor, usando o componente "Timer".

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Opa..valeu vou tenta fazer aqui dps respondo..valeu pela ajuda

    olha..eu acho que eu consegui fazer em outra thread mas nao to conseguindo pausar..

    eu fiz assim:

    adicionei uma novo arquivo de classe no projeto e nele coloquei.

    Imports System.Threading

    Public Class Threadtype

    Public Sub TypingEffect2(ByRef msg As String)

    Dim msgLen As Short

    Dim currIndex As Short

    Dim currChar As String

    Dim currText As String

    msgLen = Len(msg)

    Do While currIndex <= msgLen

    currIndex = currIndex + 1

    currChar = Mid(msg, currIndex, 1)

    currText = currText & currChar

    Principal.Label1.Text = currText

    Loop

    End Sub

    End Class

    ai dps no evento do botao eu coloquei no form principal

    Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click

    Dim worker As New Threadtype()

    worker.TypingEffect2("Text")

    End Sub

    so que depois nao consigo usar

    Threadtype.suspende

    =/ o que to fazendo de errado?

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Você precisa usar a classe Thread, fica mais ou menos assim:


    Dim worker As New Thread(AddresOf TypingEffect2)
    worker.Start("Text")
    worker.Suspend()
    worker.Resume()

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Error 3 Overload resolution failed because no accessible 'New' can be called with these arguments:

    'Public Sub New(start As System.Threading.ParameterizedThreadStart)': Method 'Public Sub TypingEffect2(ByRef msg As String)' does not have the same signature as delegate 'Delegate Sub ParameterizedThreadStart(obj As Object)'.

    'Public Sub New(start As System.Threading.ThreadStart)': Method 'Public Sub TypingEffect2(ByRef msg As String)' does not have the same signature as delegate 'Delegate Sub ThreadStart()'

    Dim worker As New Threadtype()

    Dim Thread As New Thread(AddressOf worker.TypingEffect2)

    Desculpa ae mano..mas nao to conseguindo =p, ja procurei exemplo na internet mas continua dando o mesmo erro =/

    ele nao aceita Public Sub TypingEffect2(ByRef msg As String) so Public Sub TypingEffect2

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Não é assim... Não precisa criar uma classe só pra isso:


    Imports System.Threading
    Class Form1
    Private Sub TypingEffect(ByRef msg As String)
    Dim msgLen As Short
    Dim currIndex As Short
    Dim currChar As String
    Dim currText As String
    msgLen = Len(msg)
    Do While currIndex <= msgLen
    System.Windows.Forms.Application.DoEvents()
    currIndex = currIndex + 1
    currChar = Mid(msg, currIndex, 1)
    currText = currText & currChar
    Label1.Text = currText
    System.Windows.Forms.Application.DoEvents()
    Thread.Sleep(150)
    Loop
    End Sub
    Dim worker As Thread
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    if Button2.text = "Pause" then
    Button2.text = "Continuar"
    worker.Suspend()
    elseif Button2.text = "Continuar" then
    Button2.text = "Pause"
    worker.Resume()
    else
    worker = New Thread(AddresOf TypingEffect2)
    worker.Start("Text")
    Label1.Text = Nothing
    Button2.text = "Pause"
    end if
    End Sub
    End Class

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • continua dando o mesmo erro mano :(

    Error 4 Overload resolution failed because no accessible 'New' can be called with these arguments:

    'Public Sub New(start As System.Threading.ParameterizedThreadStart)': Method 'Private Sub TypingEffect(ByRef msg As String)' does not have the same signature as delegate 'Delegate Sub ParameterizedThreadStart(obj As Object)'.

    'Public Sub New(start As System.Threading.ThreadStart)': Method 'Private Sub TypingEffect(ByRef msg As String)' does not have the same signature as delegate 'Delegate Sub ThreadStart()'.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Ah... Altere a declaração do TypingEffects para:


    Private Sub TypingEffect(msg As Object)

    Ou então crie uma função só para essa conversão:


    Private Sub TypingEffectThread(msg As Object)
    TypingEffect(msg)
    End sub

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • hsuaiushuahuishauih

    Muito obrigado por ta me ajudando..tipo..o Pause funciono perfeitinho..so que quando eu clico para continuar..ele recomeça

    Agora o sleep so ta dando "Sleep" no Thread..uma coisa ja fico certa =)

    obrigado + uma vez

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Estranho...

    Tente colocar um breakpoint nos tres casos do if para saber onde ele cai no "continuar".

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • recebi esse erro:

    Cross-thread operation not valid: Control 'Label1' accessed from a thread other than the thread it was created on.
    mesmo clikando pra continua ele fica voltando nisso e aparece na linha
    Label1.Text = currText

    Eu diria q e alguma problema na minha funcao =/

    e agora apareceu outro problema também: como eu faco pra ele identificar quando acaba de digita o meu texto?

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Esqueci desse detalhe...

    Você pode evitar esse erro criando (mais) um metodo na classe form1 e chamando ele via Invoke:


    Sub setLabel(value As Object)
    Label1.Text = value
    End Sub

    E na hora de chamar da outra thread:


    Invoke(AddressOf setLabel, currText)

    Controles não podem ser acessados de threads diferentes a não ser pelo Invoke, que todos eles tem...

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • intao ficaria assim:

        Sub setLabel(ByVal value As Object)
    Label1.Text = value
    End Sub

    e

        Private Sub TypingEffect(ByVal msg As Object)
    Dim msgLen As Short
    Dim currIndex As Short
    Dim currChar As String
    Dim currText As String
    msgLen = Len(Msg)
    Do While currIndex <= msgLen
    currIndex = currIndex + 1
    currChar = Mid(msg, currIndex, 1)
    currText = currText & currChar
    Invoke(AddressOf setLabel, currText)
    Thread.Sleep(150)
    Loop
    End Sub

    desculpa pelas perguntas idiotas..e que to meio que começando com vb.net

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Isso,

    Ah, esqueci de falar no inicio, e coloquei só no segundo post, mas porque não usa o timer?

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Isso,

    Ah, esqueci de falar no inicio, e coloquei só no segundo post, mas porque não usa o timer?

    1 problema por vez ne =p, to começando com vb

    ta aparecendo esse erro =(

    Error	1	'AddressOf' expression cannot be converted to 'System.Delegate' because type 'System.Delegate' is declared 'MustInherit' and cannot be created.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Isso que da confia nas conversões automáticas do VB :muro:

    Na linha do Invoke coloque:


    Invoke(New ParameterizedThreadStart(AddressOf setLabel), New Object(){currText})

    No lugar do ParameterizedThreadStart você poderia criar um Delegate para colocar ai, esse funciona por ter a mesma assinatura, o New Object(){currText} fica assim pelo segundo parâmetro ser uma Array, mas eu não tenho certeza se é "param array" ou não (to sem o Visual Studio aqui, fazendo tudo de cabeça e sem testar, ai ja viu né...), se for... Então vai da pau, mas ai é só passar o currText direto.

    ps: Ok, você ta aprendendo, brincar com threads é legal, mas... Você ta entendendo como funciona ou só copiando o código? Se alguma coisa ficar difícil pode falar, esse código ai tem valor para aprender como usar threads com forms, mas só para fazer o que você queria usar o timer é muito mais simples.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Nao to entendendo 100% mas to entendo sim :)

    Mas tipo..o continue nao ta funcionando ainda :(

    sera que devo tentar fazer com timer?

    acho que e melhor..porque eu tb preciso fazer alguma coisa pra ele identifica quando acaba de digita a ultima letra do text

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Isso do continue é estranho... Só debugando mesmo e vendo por onde eles passa.

    O uso do timer é mais indicado nessa situação.

    E para ele identificar que acabou coloque alguma coisa depois do "Loop", e isso vale tanto para o timer quanto para a thread.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Consegui fazer o treco pra ve quando acaba o texto ja =p

    consegui arrumar o treco do continuar tb =/ era um erro estúpido =p

    acha que eu devo mudar pra timer? ou deixa assim mesmo? se sim..como eu faria para cada vez que o timer chega no 0 ele digita uma letra?

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Usando o timer:

    - Considere o evente Tick como sendo o código dentro do Do While...Loop;

    - O Invoke e o Sleep são desnecessários;

    - As variáveis você declara na classe;

    - No evento faça uma verificação para saber quando chgou o ultimo char assim poderá tomar uma ação;

    - Para iniciar/reiniciar coloque os valores inicias para as variaveis e a propriedade Enabled do timer como true;

    - Para pausar coloque a propriedade Enabled do timer como false;

    - Para continuar coloque a propriedade enabled como true, sem alterar as variaveis.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • so 1 duvida..

    qual a diferença de

    timer1.start

    e

    timer1.enable = true

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário

    Entre para seguir isso  





    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

    Direitos autorais

    Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

    ×