Come risolvereste?!

domenica 10 ottobre 2010 - 02.07
Tag Elenco Tags  C#  |  .NET 3.5  |  Windows 7  |  Visual Studio 2008  |  SQL Server 2005

andreadp Profilo | Junior Member

Allora ragazzi. Nella mia applicazione (c# e windows form con Visual Studio 2008) ho necessita in thread che prima che venga eseguita un'istruzione si aspetti un po (qualche secondo)
Non posso usare uno sleep perchè in questo modo viene addormentata l'applicazione ... e proprio questo io devo evitare.
Riassumendo:

istruzione a
---
..
istruzione b

Tra l'istruzione a e l'istruzione b io devo attendere qualche secondo perchè si possono verificare delle condizioni e quindi cambiare alcune variabili che mi serivranno per il proseguo e che sono determinanti per l'istruzione b.
Cosa suggerite???

grazie mille
Andrea

kataklisma Profilo | Senior Member

Ciao!

>Allora ragazzi. Nella mia applicazione (c# e windows form con
>Visual Studio 2008) ho necessita in thread che prima che venga
>eseguita un'istruzione si aspetti un po (qualche secondo)
>Non posso usare uno sleep perchè in questo modo viene addormentata
>l'applicazione ... e proprio questo io devo evitare.
>Riassumendo:
>
>istruzione a
>---
>..
>istruzione b
>
>Tra l'istruzione a e l'istruzione b io devo attendere qualche
>secondo perchè si possono verificare delle condizioni e quindi
>cambiare alcune variabili che mi serivranno per il proseguo e
>che sono determinanti per l'istruzione b.
>Cosa suggerite???

Scusami ma, potresti spiegare meglio la situazione?Ovvero hai parlato di thread, parli del thread principale o ne lanci uno parallelo?Queste condizioni che possono verificarsi vengono create in questo thread "parallelo" o sono condizioni esterne al programma?

Non potresti invece gestire tutto con un'evento?Ovvero :

1)Sottoscrivi un nuovo gestore evento
2)fai partire il "metodo2" (che contiene praticamente le "condizioni" da verificare) alla fine del metodo scateni l'evento sottoscritto e nel suo gestore completi le operazioni.


Se parli invece di thread differenti lanciati da te e sei SICURO del loro comportamento puoi semplicemente "mettere in pausa" il thread principale e "riattivarlo" dal thread secondario :

private void button2_Click(object sender, RoutedEventArgs e) { //... //Tue istruzioni.... //... //Creo il nuovo thread Thread t = new Thread(RoutineThread2); //Lo faccio partire impostando //come parametro il thread corrente t.Start(Thread.CurrentThread); //Sospendo il thread corrente Thread.CurrentThread.Suspend(); } private void RoutineThread2(object o) { for (int i = 0; i < 100; i++) { //Se siamo al terzo ciclo, riattiva //il thread principale if (i == 3) { ((Thread)o).Resume(); Thread.CurrentThread.Abort(); } MessageBox.Show("cccc"); } }


Quest'ultima idea l'ho buttata giu molto velocemente ma a mio parere (e non solo) non è una pratica corretta, questa gestione puo causare parecchi problemi riguardanti la concorrenza sulle risorse e perciò è da evitare a meno che, ripeto, non conosci a fondo il comportamento dei thread e sei sicuro delle loro operazioni, evitando ogni tipo di Exception la cosa migliora, resta comunque il fatto che se mi parli di mettere in pausa e riattivare non hai molte vie d'uscita...ovviamente potresti usare altro genere di classi per la gestione/sincronizzazioni dei thread (Mutex, semaphore etc...) per ottenere una "corretta gestione" ma il succo della questione rimane inviariato.

Ricorda che la creazione, il blocco, la sospensione o la riattivazioni di thread sono pratica da utilizzare con cautela e con i giusti strumenti e accorgimenti,spero che analizzando per bene la cosa potrai cavartela con qualche evento o giu di li ;)

Queste sono solo delle idee, ma se ci spieghi meglio (e magari posti un po di codice) si trovano sicuramente soluzioni piu adatte e/o migliori!

>grazie mille
Di nulla ;) Fammi sapere!

------------------------------------------
Ignazio Catanzaro

http://blogs.dotnethell.it/swdev/

luigidibiasi Profilo | Guru

>ho necessita in thread che prima che venga eseguita un'istruzione si aspetti un po (qualche secondo)
ipotizzo che ci sono altri thread oltre ad A che girano e credo tu intenda di voler bloccare solo A per qualche secondo.

>Non posso usare uno sleep perchè in questo modo viene addormentata
Se la tua necessità è attendere "qualche secondo" (un volta fissati quanti secondi attendere quel tempo deve rimanere costante) e ti trovi un thread 'secondario' (appunto A) non quello principale potresti fare così: (da scrivere nel thread A)

'ISTRUZIONI

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

'ISTRUZIONI DOPO AVER ATTESO


Tieni presente che questo metodo è abbastanza scorretto e va utilizzato solo se sei sicuro che devi attendere 'circa' un numero di secondi sempre uguale prima di continuare.

>Tra l'istruzione a e l'istruzione b io devo attendere qualche
>secondo perchè si possono verificare delle condizioni e quindi
>cambiare alcune variabili che mi serivranno per il proseguo e
>che sono determinanti per l'istruzione b.

Se durante l'esecuzione di thread A prima di lanciare il B si possono verificare modifiche a variabili c'è un thread C che le modifica? Oppure vengono modificate dal thread principale? Oppure è A che le modifica?

>Cosa suggerite???
>
Di descrivere bene le operazioni che devi eseguire e possibilmente utilizzare uno dei metodi di concorrenza che ti vengono messi a disposizione dal sistema operativo (e che ti sono stati suggeriti nel post precedente).
Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/

andreadp Profilo | Junior Member

Che bello..quante risposte.
In realtà l'applicazione è abbastanza complessa..ma concentriamoci solo su questo punto.
Praticamente è un'applicazione che tra le altre cose gestisce l'inserimento e l'estrazione di smart card.
Il problema sorge quando si entra ed esce velocemente la smart card.
La mia idea era quella di aspettare qualche secondo per essere sicuri che la smart non sia stata estratta, prima di far partire le istruzioni relative all'inserimento (e già ho una variabile che mi garantisce ciò).
Da qui la mia necessità di attesa di 5 sec.

Che ne dite?


Andrea

luigidibiasi Profilo | Guru

>Praticamente è un'applicazione che tra le altre cose gestisce
>l'inserimento e l'estrazione di smart card.

ma ti è stato fornito un framework di sviluppo o ti colleghi al lettore direttamente (ad esempio tramite una com virtuale)?

>Il problema sorge quando si entra ed esce velocemente la smart
>card.

qui ti si scatena un evento?

>La mia idea era quella di aspettare qualche secondo per essere
>sicuri che la smart non sia stata estratta, prima di far partire
>le istruzioni relative all'inserimento (e già ho una variabile
>che mi garantisce ciò).
>Da qui la mia necessità di attesa di 5 sec.

>
>Che ne dite?
>
>
>Andrea

Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/

andreadp Profilo | Junior Member

Ho sviluppato una libreria apposita.
Praticamente voglio eleimnare una eccezione che si scatena quando entro ed esco velocemente la card senza dare il tempo quindi di leggerne il contenuto...

Andrea

kataklisma Profilo | Senior Member

>Ho sviluppato una libreria apposita.
>Praticamente voglio eleimnare una eccezione che si scatena quando
>entro ed esco velocemente la card senza dare il tempo quindi
>di leggerne il contenuto...

Come ti ho gia detto io e come ha ripetuto luigidibiasi, hai modo di scatenare un'evento di "entrata" ed uno di "uscita" della smart card?

Potresti risolvere in maniera veramente semplice.....


X LuigiDiBiasi : A questo punto se deve utilizzare tecniche "poco consigliate" è preferibile utilizzare i metodi Resume() e Suspend() in quanto potrebbe decidere di sbloccare il primo thread se e solo se determinate condizioni vengono soddisfatte.

>Andrea

------------------------------------------
Ignazio Catanzaro

http://blogs.dotnethell.it/swdev/

luigidibiasi Profilo | Guru

>>Praticamente voglio eleimnare una eccezione che si scatena quando
>>entro ed esco velocemente la card senza dare il tempo quindi
>>di leggerne il contenuto...

Credo che il problema sia qui.

Tu rilevi che la smartcard viene inserita e subito dopo lanci un thread per la lettura?

Vuoi che prima di lanciare il thread venga accertato che la smart-card sia effettivamente dentro... per questo attendi quei secondi?

>
>Come ti ho gia detto io e come ha ripetuto luigidibiasi, hai
>modo di scatenare un'evento di "entrata" ed uno di "uscita" della
>smart card?
>
>Potresti risolvere in maniera veramente semplice.....

Credo che abbia modo di rilevare entrambe le cose... magari deve cambiare un po' l'architettura dei metodi che ha scritto.

>
>
>X LuigiDiBiasi : A questo punto se deve utilizzare tecniche "poco
>consigliate" è preferibile utilizzare i metodi Resume() e Suspend()
>in quanto potrebbe decidere di sbloccare il primo thread se e
>solo se determinate condizioni vengono soddisfatte.

Chiaro ed evidente che ho scritto quella soluzione 'blasfema' per evitargli la modifica strutturale alle classi


>
>>Andrea
>
>------------------------------------------
>Ignazio Catanzaro
>
>http://blogs.dotnethell.it/swdev/

Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/

kataklisma Profilo | Senior Member

Penso comunque che una modifica strutturale debba farla a prescindere.

Quei 5 secondi possono essere molto indicativi, potrebbero diventare 2 come potrebbero diventare 6/7, una gestione ad eventi è la soluzione migliore ;)

Attendiamo notizie!
------------------------------------------
Ignazio Catanzaro

http://blogs.dotnethell.it/swdev/

andreadp Profilo | Junior Member

Bhe toccare l'architettura a sto punto è un po complicatuccio...
In effetti ho gia una variabile che mi dice se in quel momenti la card è dentro o no.....però la devo poter verificare che la card continui a rimanere dentro anche qualche secondo dopo l'evento di inserimento...

PS. spero di essere chiaro nonostante i tanti errori di battitura che ho fatto..pardon...:-)
Andrea
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5