Salve a tutti.
IN questo periodo sto approfondendo la questione riguardante il multi-threading e devo ammettere che non la trovo molto digeribile...
Vi spiegho cosa a cosa mi serve.
Ho creato una form sulla quale voglio visualizzare (tramite controlli) tutti i file attualmente aperti nel mio PC.
I file li apro direttamente da questo programmino e quindi i controlli li aggiungo facilmente.
Il problema sorge quando chiudo il programma. Come faccio ad intercettare questo evento che avviene fuori dal mio programmino in Vb.net?
Per farlo ho pensato che, una volta aperto il file ed aggiunto il controllo alla mia form, attivo un nuovo thread che monitori costantemente i processi attivi, tramite un ciclo, che, nel momento in cui il file venga chiuso mi tolga il controllo dalla form.
Il codice che ho usato è il seguente:
'creazione di un DELEGATE
Delegate Sub MyDelegate()
'creazione di un'istanza del delegate
Public myGestore As MyDelegate
Dim th As Threading.Thread
Private Sub NuovoThread()
Try
myGestore = New MyDelegate(AddressOf AttivaRicercaSession)
MyBase.Invoke(myGestore)
Catch ex As Exception
MessageError(ex)
End Try
End Sub
Sub OnFileSelected(ByVal sender As Object, ByVal e As System.EventArgs)
Try
'Attivo il procersso
Dim ps As Process = Process.Start(FilePath)
'Aggiungo il controllo
Form.controls.add(myControl)
'controlliamo se il thread è in esecuzione "per non lanciare una seconda copia"
If Not (th Is Nothing) AndAlso th.IsAlive Then Exit Sub
'creamo una nuova "instance" di thread
th = New Thread(AddressOf NuovoThread)
With th
.Name = ps.Id
'lanciamo il thread
.Start()
End With
Catch ex As Exception
MessageError(ex)
End Try
End Sub
Sub AttivaRicercaSession()
Try
Dim value As Boolean = True
Do While value = True
value = FileIsOpened(th.Name)
'Fermo il thread ogni secondo,
'di modo tale che la ricerca venga avviata
'ogni 1000 millisecondi
Thread.Sleep(1000)
Loop
'Elimino il controllo dalla form
Form.controls.remove(MyControl)
Catch ex As Exception
MessageError(ex)
End Try
End Sub
Function FileIsOpened(ByVal IdSession As Integer) As Boolean
Try
Dim value As Boolean = False
For Each p As Process In Process.GetProcesses()
If p.Id = th.Name Then
value = True
End If
Next
Return value
Catch ex As Exception
MessageError(ex)
End Try
End Function
Il codice di per sé funziona: quando chiudo il file effettivamente riconosce l'evento.
Il problema è che, se il file non viene chiuso entro cinque secondi, la form del mio programma entra in una 'fase di sospensione': mi fa vedere i bordi quando io l'ho impostata senza bordi e i controlli aggiunti non vengono visualizzati correttamente. Secondo voi quale potrebbe essere l'inghippo?
Una volta che il thread ha riconosciuto che il file è stato chiuso, cosa devo fare? Devo chiudere il thread? Se sì, in che modo?
Ho provato con il seguente codice:
th.abort
thy.join
ma mi da errore (messaggio: Thread interrotto)
Spero di essere stato chiaro. Grazie a chiunque voglia aiutarmi a risolvere questo problema.
Daniele