Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    Vb.net - Multi-threading

    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

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463

    Moderazione

    Ho spostato la discussione all'interno del forum dedicato a Visual Basic (VBx, VBA, VBScript, ...) e ai linguaggi per .NET Framework (VB.NET, C#, ...).

    In futuro, poni in questo forum le domande relative a questi linguaggi.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.