Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
.NET Framework
Conto alla rovescia in VB.net
martedì 16 gennaio 2007 - 12.55
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
satomi
Profilo
| Junior Member
60
messaggi | Data Invio:
mar 16 gen 2007 - 12:55
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
7.999
messaggi | Data Invio:
gio 18 gen 2007 - 15:21
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
60
messaggi | Data Invio:
gio 18 gen 2007 - 15:30
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
7.999
messaggi | Data Invio:
gio 18 gen 2007 - 15:32
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
60
messaggi | Data Invio:
gio 18 gen 2007 - 15:50
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
7.999
messaggi | Data Invio:
gio 18 gen 2007 - 16:01
>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
60
messaggi | Data Invio:
gio 18 gen 2007 - 17:28
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
7.999
messaggi | Data Invio:
gio 18 gen 2007 - 17:36
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
60
messaggi | Data Invio:
gio 18 gen 2007 - 17:52
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
7.999
messaggi | Data Invio:
gio 18 gen 2007 - 18:01
>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
60
messaggi | Data Invio:
ven 19 gen 2007 - 09:52
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
7.999
messaggi | Data Invio:
ven 19 gen 2007 - 10:58
>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
60
messaggi | Data Invio:
ven 19 gen 2007 - 11:28
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
7.999
messaggi | Data Invio:
ven 19 gen 2007 - 11:46
>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
60
messaggi | Data Invio:
ven 19 gen 2007 - 11:53
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
7.999
messaggi | Data Invio:
ven 19 gen 2007 - 15:37
>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
60
messaggi | Data Invio:
ven 19 gen 2007 - 16:11
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
60
messaggi | Data Invio:
lun 22 gen 2007 - 11:26
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
Torna su
Stanze Forum
Elenco Threads
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 !