Problema multi Thread o NotifyIcon

domenica 12 febbraio 2012 - 12.56
Tag Elenco Tags  VB.NET  |  .NET 4.0  |  Windows 7  |  Visual Studio 2010

logan88 Profilo | Newbie

Salve a tutti,

innanzitutto complimenti x il forum e x la competenza! consultando le vostre pagine ho risolto molti problemi che opprimevano la mia programmazione xD

detto questo, arrivo al punto! sto cercando di realizzare un programma multi thread senza interfaccia grafica ma ho riscontrato un problema: nn capisco se il programma non funziona causa problemi tra l'esecuzione del 2° thread e l'application.run del 1° thread ke mi serve a visualizzare il menù contestuale

nel 1° thread (main) ho solo il menu contestuale mentre nel secondo c'è un ciclo for che controlla continuamente se l'utente digita una sequenza di numeri (password) confrontando i numeri digitati con quelli memorizzati su una stringa

seguendo passo passo la funzione del 2° thread sembra funzionare, ma una volta eseguito un debug pur digitando la password non accade nulla

ecco il codice che ho reallizato

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Jeremy Profilo | Guru

Ciao
Nel codice che hai scritto tu .... succede, che m è quasi sempre uguale a 0 ed è per quello che ti sembra non accada nulla.
Do For e = 48 To 57 If GetAsyncKeyState(e) <> 0 Then If Chr(e) = pos(m) Then m += 1 Else m = 0 End If If m = pos.lenght Then MessageBox.Show("Password corretta") End If End If Threading.Thread.Sleep(100) Next Loop
Il codice non l'ho provato .... quindi potrebbe essere da aggiustare ....

Facci sapere...
Ciao

logan88 Profilo | Newbie

e il problema è proprio che getasynckeystate non posso seguirlo passo passo

x vedere cosa accade se un tasto risulta premuto impostavo b= -32767 (infatti sta in commento) e in quel modo funziona (passo passo)

ri-controllo la funzione, anke in base alla tua e posto i risultati! thx


logan88 Profilo | Newbie

ok, ora ho fatto così

Do For e = 48 To 57 If GetAsyncKeyState(e) <> 0 Then If m < Len(pwctrl) Then If Chr(e) = pos(m) Then m += 1 Else m = 0 End If If m = Len(pwctrl) Then MessageBox.Show("Password corretta") End If End If End If Threading.Thread.Sleep(100) Next e Loop


e già funziona meglio
ho aggiunto If m < Len(pwctrl) altrimenti m andava oltre i limiti di pos
e if = len(pwctrl) anizkè pos.lenght xkè dava errore
ora se si inserisce la pw giusta viene visualizzata la messagebox

ma nn ho capito xkè se digito la pw sul tastierino numerico nn funge O.o i codici ascii dei numeri del tastierino sn diversi da quelli ke stanno sopra le lettere???? O______O

Jeremy Profilo | Guru

Ciao
>ma nn ho capito xkè se digito la pw sul tastierino numerico nn
>funge O.o i codici ascii dei numeri del tastierino sn diversi
>da quelli ke stanno sopra le lettere???? O______O
Si ... sono diversi.
Dovrebbero essere dal 96 al 105.

logan88 Profilo | Newbie

96 mi dà l'apice '
e poi da 97 in poi sn lettere minuscole

cmq ho esteso il for a tt i tasti, quindi

for e = 0 to 255

ma nn funzia lo stesso il tastierino :S

Jeremy Profilo | Guru

Attenzione che i codici che passi come parametro alla funzione GetAsyncState ... non sono i codici Ascii dei caratteri ....
Prova a modificare il codice in questo modo
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Facci sapere...
Ciao

Jeremy Profilo | Guru

O meglio ancora .... per capire la differenza tra l'enumeratore Keys e i codici ASCII
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

logan88 Profilo | Newbie

si mi ritorna i valori da 97 a 106

ma allora xkè nn funzia? O.o

x quanto riguarda lo sleep, l'avevo già messo prima del loop ma poi l'ho messo dentro il ciclo xkè così impiega meno tempo ad apparire la messagebox
anke se nn mi spiego xkè

Jeremy Profilo | Guru

>si mi ritorna i valori da 97 a 106
>
>ma allora xkè nn funzia? O.o
Perchè tu converti il valore della variabile "e" in codice Ascii.
Invece devi convertire la variabile "e" in enumeratore Keys e creare un SelectCase per capire quale tasto è stato premuto.
Anche se, nel caso specifico, si potrebbe usare un trucchetto(ma solo se la password è composta da soli numeri).

logan88 Profilo | Newbie

certo, confronto il chr io :S

cmq si, la pw può essere solo numerica :o

trukketto? *.*

Jeremy Profilo | Guru

Prova con questo codice
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Facci sapere...
Ciao

logan88 Profilo | Newbie

così restituisce anke i valori del tastierino, ma quando si preme qualsiasi altro tasto (mouse compreso) ridà l'ultimo valore
e poi mostra a ogni pressione anke la finestra della password incrementata

cmq è già qualcosa :) nn cerco la pappa pronta, provo ad adattarla

Jeremy Profilo | Guru

>cmq è già qualcosa :) nn cerco la pappa pronta, provo ad adattarla
Infatti lo spirito è quello .... i miei sono solo esempi "dimostrativi" che dovrebbero metterti sulla strada giusta.

Facci sapere...
Ciao

logan88 Profilo | Newbie

ci sn quasi

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

quando torno da lavoro completo
;)

logan88 Profilo | Newbie

oook

adesso ho fatto così:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

ora ho solo un problema: nn funzionano i numeri sopra le lettere xD mi dà un warning su pos(m): is used before it as been assigned a value

mentre sul secondo if nn lo dà

Jeremy Profilo | Guru

Ciao
Il compilatore ti sta avvisando che potrebbe verificarsi un eccezione a runtime in quanto la variabile pos() non è stata dimensionata prima di essere utilizzata.
Pertanto, prima di scrivere pos(m), devi dare una dimensione alla matrice pos.



logan88 Profilo | Newbie

si lo so, il fatto è ke è già dimensionata e piena, posto la funzione completa

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

edit: è l'else : m=0 ke ho aggiunto ke nn fa funzionare il primo if, xkè azzera m se premo tasti diversi dal tastierino

edit2: ho risolto così

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

resta il warning ma cmq funziona esattamente come volevo ;) thx la dritta CType(DirectCast(e, Keys).ToString.Replace :)

edit2: questa è la versione definitiva, quella precedente era un pò instabile :S

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

logan88 Profilo | Newbie

nn mi spiego xkè ma a volte la funzione nn va :S suggerimenti?
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-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5