Ir ao conteúdo
  • Cadastre-se

[Ajuda VB.net] Pausando uma funcao


mazzotti

Posts recomendados

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

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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.

Link para o comentário
Compartilhar em outros sites

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?

Link para o comentário
Compartilhar em outros sites

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

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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

Link para o comentário
Compartilhar em outros sites

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()'.

Link para o comentário
Compartilhar em outros sites

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?

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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...

Link para o comentário
Compartilhar em outros sites

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

Link para o comentário
Compartilhar em outros sites

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.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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.

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...