Conto alla rovescia in VB.net

martedì 16 gennaio 2007 - 12.55

satomi Profilo | Junior Member

Ciao a tutti
Avrei un problemino, cerco di spiegarmi: Ho un'applicazione in Vb.net che che mi prende u na presentazione di power point e me la visualizza in un form al centro. Sopra alla presentazione ho il nome del relatore e il timer, cioè il tempo che il relatore ha a disposizione. Però quando avanzo con le slide velocemente il timer mi si blocca, poi appena mi fermo va in dietro velocemente per recuperare il tempo che mancava. Spero che mi sia spiegato. Io non vorrei che il timer si fermasse. ma che continuasse anche se il mio avanzamento è veloce. Non so se mi sono spiegato spero di sì.
Qualcuno sa come aiutarmi
Graize Ciao

Brainkiller Profilo | Guru

Ciao Satomi,
puoi spiegare meglio perchè non ho capito bene. La presentazione dove la carica dentro il Form ? Hai usato qualche controllo di Office per integrarla dentro il Form ?

Il timer l'hai creato tu ? Se sì in che modo.

Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

satomi Profilo | Junior Member

Ciao grazie di avermi risposto.
Cerco di spiegarmi meglio: la presentazione la carico dentro a l'oggetto groupbox utilizzando controlli office. Ho utilizzato un group box xchè sopra alla presentazione ho messo il nome del relatore e il timer. Il timer l'ho fatto io. Cerco di spiegarti il funzionamento del mio timer:
appena parte la presentazione sarà visualizzato in questo modo:
30:00 dove 30 sono i minuti e 00 sono i secondi.
Quando premo il tasto 'c' inizia il count down cioè: 29:59, 29:58, ....... ecc, ecc. e se il tampo a sua disposizione finisce diventerà negativo cioè -00:01, -00:02, -00:03, -00:04................ -01:58 ecc. lampeggiando in rosso.
Ma se io vado avanti velocemente con le slide intendo velocemente del tipo che tengo premuto il tasto di avanzamento per pareccghi secondi il timer si ferma, poi appena rilascio questo il tasto scorre indietro velocemente finche nn arriva al tempo corretto. Spero che sei riuscito a capirmi e spero che io mi sia spiegato bene
grazie ancora

Ciao

Brainkiller Profilo | Guru

Ok ma il timer come l'hai realizzato ?
Hai utilizzato l'oggetto Timer della Toolbox ?
Cioè come fai a far scendere i secondi ?

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

satomi Profilo | Junior Member

Sì l'ho fatto io utlizzando l'oggetto timer di VB.net ti posto anche il codice.

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Dim p As Array
Dim secondi As Integer
Dim Minuti As Integer
Dim divisione_numero As String
Dim totale As Integer

divisione_numero = Me.Label1.Text

p = divisione_numero.Split(":")

Minuti = CInt(p(0))
secondi = CInt(p(1))

totale = (Minuti * 60) + secondi
If (Me.Label1.Text.Substring(0, 1) = "-") Then
Me.Label1.ForeColor = Color.Red
If (totale Mod 2) = 0 Then
Me.Label1.ForeColor = Color.Red
Me.Label1.Visible = False
Else
Me.Label1.Visible = True
Me.Label1.ForeColor = Color.Red
End If
End If

If Minuti = 0 And prova = True Then
If secondi = 59 Then
secondi -= 1
Minuti = 0
ElseIf secondi = 0 Then
Minuti = 0
secondi = 0
prova = False
Else
secondi -= 1
End If
End If

If Minuti = 0 And prova = False Then
If secondi = 0 Then
secondi += 1
Minuti = 0
ElseIf secondi = 59 Then
secondi = 0
Minuti -= 1
prova = True
Else
secondi += 1
End If
End If

If (Minuti > 0) And prova = False Then
If (secondi = 0) Then
secondi = 59
If Minuti = 1 Then
Minuti = 0
prova = True
Else
Minuti -= 1
End If
Else
secondi -= 1
End If
End If

If (Minuti < 0) Then
If (secondi = 59) Then
secondi = 0
Minuti -= 1
Else
secondi += 1
End If
End If

Dim minuti2 As String
Dim secondi2 As String

minuti2 = Minuti.ToString
secondi2 = secondi.ToString

If minuti2 = "0" And prova = True Then
minuti2 = "00"
End If

If minuti2 = "0" And prova = False Then
minuti2 = "-00"
End If

If minuti2.Length = 1 Then
minuti2 = "0" & minuti2
End If
If secondi2.Length = 1 Then
secondi2 = "0" & secondi2
End If

If (minuti2.Substring(0, 1) = "-" And (minuti2.Length = 2)) Then
Dim minuti3 As String
minuti3 = "-0" & minuti2.Substring(1, 1)
minuti2 = minuti3
End If
Me.Label1.Text = minuti2 & ":" & secondi2

End Sub

lo Start avvine quando viene premuto c

Può darsi che il codice nn suia bellissimo ma sono alle prime armi con Vb.net

ciao

Brainkiller Profilo | Guru

>Sì l'ho fatto io utlizzando l'oggetto timer di VB.net ti posto
>anche il codice.

Ciao il codice anche se sei all'inizio a grandi linee potrebbe andare bene. Per me è un problema di Threading, ossia quando carichi o sfogli le slide l'operazione è blocking e quindi il Thread del Timer in qualche modo si blocca. Bisognerebbe creare un Thread separato in modo che vada avanti per conto suo restando indipendente dal Thread in cui è caricato il file di Power Point.

Però se sei alle prime armi è difficile mettere in piedi un nuovo Thread, o un nuovo Timer.

In ogni caso io ti consiglio di usare la classe Timer contenuta nel namespace System.Threading.
Sul .NET Framework trovi documentazione e anche esempi su come utilizzarla.
Proverei quindi a sostituire il tuo timer, con questo System.Threading.Timer.
Il principio è più o meno lo setsso, una volta creato, gli dai il tempo del Tick esempio 1000 secondi e poi specifichi una funzione da chiamare ogni tick.

Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

satomi Profilo | Junior Member

Io ho prova a fare una cosa di questo tipo il blocco che ti ho scritto prima l'ho messo dentro a una funziona in questo modo:

Private Sub prova_timer()
Dim p As Array
Dim secondi As Integer
Dim Minuti As Integer
Dim divisione_numero As String
Dim totale As Integer

divisione_numero = Me.Label1.Text

p = divisione_numero.Split(":")

Minuti = CInt(p(0))
secondi = CInt(p(1))

totale = (Minuti * 60) + secondi
If (Me.Label1.Text.Substring(0, 1) = "-") Then
Me.Label1.ForeColor = Color.Red
If (totale Mod 2) = 0 Then
Me.Label1.ForeColor = Color.Red
Me.Label1.Visible = False
Else
Me.Label1.Visible = True
Me.Label1.ForeColor = Color.Red
End If
End If

If Minuti = 0 And prova = True Then
If secondi = 59 Then
secondi -= 1
Minuti = 0
ElseIf secondi = 0 Then
Minuti = 0
secondi = 0
prova = False
Else
secondi -= 1
End If
End If

If Minuti = 0 And prova = False Then
If secondi = 0 Then
secondi += 1
Minuti = 0
ElseIf secondi = 59 Then
secondi = 0
Minuti -= 1
prova = True
Else
secondi += 1
End If
End If

If (Minuti > 0) And prova = False Then
If (secondi = 0) Then
secondi = 59
If Minuti = 1 Then
Minuti = 0
prova = True
Else
Minuti -= 1
End If
Else
secondi -= 1
End If
End If

If (Minuti < 0) Then
If (secondi = 59) Then
secondi = 0
Minuti -= 1
Else
secondi += 1
End If
End If

Dim minuti2 As String
Dim secondi2 As String

minuti2 = Minuti.ToString
secondi2 = secondi.ToString

If minuti2 = "0" And prova = True Then
minuti2 = "00"
End If

If minuti2 = "0" And prova = False Then
minuti2 = "-00"
End If

If minuti2.Length = 1 Then
minuti2 = "0" & minuti2
End If
If secondi2.Length = 1 Then
secondi2 = "0" & secondi2
End If

If (minuti2.Substring(0, 1) = "-" And (minuti2.Length = 2)) Then
Dim minuti3 As String
minuti3 = "-0" & minuti2.Substring(1, 1)
minuti2 = minuti3
End If
Me.Label1.Text = minuti2 & ":" & secondi2

End Sub

poi ho richiamato questa funziona in questo modo

Private Sub richiamo_timer()
Dim p As New TimeSpan(0, 0, 1)
Dim period As New TimeSpan(0, 0, 0, 0, 1000)
Using t As New System.Threading.Timer(AddressOf prova_timer, Nothing, p, period)
System.Threading.Thread.Sleep(5000)
End Using
End Sub

però mi daà un errore quando non quando compilo ma quando faccio entrare in esecuzione il mio timer cioè quando prendo c come mai????

Brainkiller Profilo | Guru

Che errore innazitutto, e seconda cosa , prova ad andare in debug per capire perchè scatta un errore.
Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

satomi Profilo | Junior Member

L'errore che mi dà è:
Operazione cross-thread non valida: è stato eseguito l'accesso al controllo 'Label1' da un thread diverso da quello da cui è stata eseguita la creazione.
Label1 è la mia etichetta uin cui inserisco questo conto alla rovescia.... é possibile che il problema siano le restrizioni che ho sul mio pc??? Cioè io sul mio pc posso utilizzarlo solo come user e non come administrator.... Non vorrei dire stupidate.....

Brainkiller Profilo | Guru

>L'errore che mi dà è:
>Operazione cross-thread non valida: è stato eseguito l'accesso
>al controllo 'Label1' da un thread diverso da quello da cui è
>stata eseguita la creazione.

Ok perfetto, questo sta a significare che non puoi andare ad impostare la proprietà di un controllo da un altro Thread, è un problema comune.

Allora fai così, invece di usare un Label1.Text e/o tutte queste istruzioni che vanno a modificare proprietà di controlli della Form, utilizza il Console.WriteLine tanto per capire se in ogni caso il timer si blocca o meno. Iniziamo a risolvere il primo problema.

Ciao


David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

satomi Profilo | Junior Member

Ciao
Scusa per ieri ma sono dovuto andare in riunione e si è fatto tardi.
Allora invece di mettere tutto il mio codice all'interno della mia applicazione ho provato a metterlo in una nuova applicazione e il mio codice è il seguente:
Imports System
Imports System.Threading

Public Class form1
Private Shared ticker As Timer
Private Shared prova As Boolean = False
Private Shared prova_num As String = "10:00"
Public Shared Sub TimerMethod(ByVal state As Object)
Dim p As Array
Dim secondi As Integer
Dim Minuti As Integer
Dim divisione_numero As String
Dim totale As Integer

'divisione_numero = prova_num

p = prova_num.Split(":")

Minuti = CInt(p(0))
secondi = CInt(p(1))

totale = (Minuti * 60) + secondi
'If (Me.Label1.Text.Substring(0, 1) = "-") Then
' Me.Label1.ForeColor = Color.Red
'If (totale Mod 2) = 0 Then
'Me.Label1.ForeColor = Color.Red
'Me.Label1.Visible = False
'Else
'Me.Label1.Visible = True
'Me.Label1.ForeColor = Color.Red
'End If
'End If

If Minuti = 0 And prova = True Then
If secondi = 59 Then
secondi -= 1
Minuti = 0
ElseIf secondi = 0 Then
Minuti = 0
secondi = 0
prova = False
Else
secondi -= 1
End If
End If

If Minuti = 0 And prova = False Then
If secondi = 0 Then
secondi += 1
Minuti = 0
ElseIf secondi = 59 Then
secondi = 0
Minuti -= 1
prova = True
Else
secondi += 1
End If
End If

If (Minuti > 0) And prova = False Then
If (secondi = 0) Then
secondi = 59
If Minuti = 1 Then
Minuti = 0
prova = True
Else
Minuti -= 1
End If
Else
secondi -= 1
End If
End If

If (Minuti < 0) Then
If (secondi = 59) Then
secondi = 0
Minuti -= 1
Else
secondi += 1
End If
End If

Dim minuti2 As String
Dim secondi2 As String

minuti2 = Minuti.ToString
secondi2 = secondi.ToString

If minuti2 = "0" And prova = True Then
minuti2 = "00"
End If

If minuti2 = "0" And prova = False Then
minuti2 = "-00"
End If

If minuti2.Length = 1 Then
minuti2 = "0" & minuti2
End If
If secondi2.Length = 1 Then
secondi2 = "0" & secondi2
End If

If (minuti2.Substring(0, 1) = "-" And (minuti2.Length = 2)) Then
Dim minuti3 As String
minuti3 = "-0" & minuti2.Substring(1, 1)
minuti2 = minuti3
End If
'Me.Label1.Text =
Console.WriteLine(minuti2 & ":" & secondi2)
prova_num = minuti2 & ":" & secondi2
End Sub

Public Shared Sub Main()
ticker = New Timer(AddressOf TimerMethod, Nothing, 1000, 1000)


'Console.WriteLine("Press the Enter key to end the program.")
Console.ReadLine()
End Sub

Private Sub form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

End Sub
End Class

e funziona in modo corretto.
Però ho sempre quel problema della laberl spero che mi darai una mano grazie 1000
Ciao

Brainkiller Profilo | Guru

>e funziona in modo corretto.
>Però ho sempre quel problema della laberl spero che mi darai
>una mano grazie 1000

Se tu non leggi i messaggi che io ti scrivo difficilmente riuscirai ad andare avanti.
Rileggi bene il penultimo.
Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

satomi Profilo | Junior Member

Mi sembra di aver fatto quello che mi hai detto cioè prima ti ho proposto l'errore, successivamente ho prova ad utilizzare il console.writeline e ti ho posto il codice, e funziona tranquillamente...

Brainkiller Profilo | Guru

>Mi sembra di aver fatto quello che mi hai detto cioè prima ti
>ho proposto l'errore, successivamente ho prova ad utilizzare
>il console.writeline e ti ho posto il codice, e funziona tranquillamente...

E allora che problema hai se funziona tranquillamente ?

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

satomi Profilo | Junior Member

Utilizzando il mio timer con il console.writeline funziona, ma il mio timer nn deve funzionare nella console, ma all'interno di una label, quindi il valore del che visualizzo in questo modo:
Console.WriteLine(minuti2 & ":" & secondi2)
dovrei visualizzarlo all'interno di una label, ma nn riesco, cioè se faccio all'interno di
Public Shared Sub TimerMethod(ByVal state As Object)
me.label1.text=minuti2 & ":" & secondi2
nn funziona.

Ho provato anche a creare un'istanza del mio form cioè:

Dim myForm As New form1 dove form1 è il mio form
e poi myform.label1.text=minuti2 & ":" & secondi2


In questo caso nn dà nessun errore ma il timer nn funziona o meglio facendo il debug funziona, ma il valore all'interno di label 1 mi rimane nothing

Brainkiller Profilo | Guru

>Utilizzando il mio timer con il console.writeline funziona, ma
>il mio timer nn deve funzionare nella console, ma all'interno
>di una label, quindi il valore del che visualizzo in questo modo:

Io volevo solo sapere se usando Console.WriteLine funziona tutto correttamente, e mentre scorri avanti e indietro le slide non si blocca come faceva prima.

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

satomi Profilo | Junior Member

Sì funziona utilizzando la console e sfogliando le slide, però adesso come ti ho detto prima nn riesco a far prendere alla mia label quel valore che visualizzo dentro alla console.

satomi Profilo | Junior Member

Scusate ma sono sempre io che rompo :-)
Sono riuscito a far prendere il valore del counter alla mia label e quando sfoglio le presentazioni in power point nn si blocca più però si blocca quando all'interno della slide ci sono dei filmati .avi. Questi filamti sono un po' pesanti ad esempio di 10 MB - 14Mb - 15 MB. E' normale che si blocchi??? C'è qualche possibilità per nn farlo bloccare?


Spero che qualcuno mi risponda
grazie 1000
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5