Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    Chiusura del thread corrente in presenza di più thread

    Ho due thread "t" e "t2" che partono (ma l'applicazione poi dovrebbe funzionare ugualmente aggiungendone 3 o più) cliccando i rispettivi bottoni (uno per ogni thread)
    il bottone di chiusura è unico, ed è impostato per chiudere il thread corrente
    dato che non voglio chiudere il thread quando il controllo è all'applicazione principale (il form) , allora ho inserito un controllo con equals() affinche la chiusura avvenga solo se il controllo ce lo ha o il thread t o il thread t2

    tuttavia ce qualcosa che non va nella chiusura del/dei thread perchè non lo chiude

    cosa sbaglio: la condizione dell'if?

    codice:
    Public Class Form1
    
        Dim t As Threading.Thread
        Dim t2 As Threading.Thread
        Dim ListBox2 As ListBox
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
            CheckForIllegalCrossThreadCalls = False
    
            ListBox2 = New ListBox
    
            With ListBox2
                .Location = New System.Drawing.Point(10, 80)
                .Size() = New System.Drawing.Size(50, 121)
            End With
            ListBox2.Visible = True
            Me.Controls.Add(ListBox2)
    
        End Sub
    
    
        'sub che crea un loop infinito
        Private Sub LoopInfinito()
    
            Dim i As Int32 = 0
            Do While True
    
                Dim j As Double = 0
                For j = 0 To 100000000
                    j += 1
                    j -= 1
                Next
                ListBox2.Items.Add("x" & i)
                i += 1
                'creo delle pause tra un incremento e l'altro
                Threading.Thread.CurrentThread.Sleep(3000)
            Loop
    
        End Sub
    
    
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    
            If Not Threading.Thread.CurrentThread.Equals(t) And _
                Not Threading.Thread.CurrentThread.Equals(t2) Then
                'MsgBox("Retry")
            Else
                Threading.Thread.CurrentThread.Abort()
            End If
    
    
        End Sub
    
    
    
        Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
    
            t = New Threading.Thread(AddressOf Me.LoopInfinito)
            t.Start()
    
        End Sub
    
    
        Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
    
            t2 = New Threading.Thread(AddressOf Me.LoopInfinito)
            t2.Start()
    
        End Sub
    
    
    End Class

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Non ho capito ma forse c'e' qualcosa che non quadra nel tuo concetto di thread corrente ...

    Nella LoopInfinito ha senso testare il thread corrente perche' e' una parte di codice che puo' essere eseguita da due thread (t e t2).

    Ma nel resto del codice (quindi anche in Button2_Click) il thread corrente sara' sempre e comunque il principale (quello con cui e' partito il processo) e quindi non ha senso testare (a prescindere da come si fa) se il thread e' un altro ... L'evento click non sara' mai eseguito dagli altri due thread perche' il loro "ambito" di esecuzione rimane la LoopInfinito.

  3. #3
    Originariamente inviato da oregon
    Non ho capito ma forse c'e' qualcosa che non quadra nel tuo concetto di thread corrente ...

    Nella LoopInfinito ha senso testare il thread corrente perche' e' una parte di codice che puo' essere eseguita da due thread (t e t2).

    Ma nel resto del codice (quindi anche in Button2_Click) il thread corrente sara' sempre e comunque il principale (quello con cui e' partito il processo) e quindi non ha senso testare (a prescindere da come si fa) se il thread e' un altro ... L'evento click non sara' mai eseguito dagli altri due thread perche' il loro "ambito" di esecuzione rimane la LoopInfinito.
    Giusto , ho fatto delle modifiche per evitare l'errore di prima

    c'è un warning che noto nel programma però
    c'era anche prima in realtà
    suggerisce di sostituire (aggiungendo la dicitura "access of shared, costant member, enum member, or nested type through an instance; qualyfing expression will not be evaluted")
    codice:
    Threading.Thread.CurrentThread.Sleep(3000)
    con
    codice:
    Threading.Thread.Sleep(3000)
    ho sostituito e il funzionamento è uguale dal punto di vista del programma,
    ma perchè mi chiede di sostituire o meglio di togliere CurrentThread?

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da leonard_shelby
    Giusto , ho fatto delle modifiche per evitare l'errore di prima
    E come?

    Non e' questione di errore ... ma di logica del programma ...

    c'è un warning che noto nel programma però ...
    Sleep e' un membro statico e quindi non lo devi usare con una istanza (CurrentThread).

    ho sostituito e il funzionamento è uguale dal punto di vista del programma
    Ovviamente ... perche' prima ignorava la tua indicazione ...

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

    Moderazione

    Il linguaggio va indicato anche nel titolo, come da Regolamento.
    Qui l'ho aggiunto io.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  6. #6
    Originariamente inviato da oregon


    Sleep e' un membro statico e quindi non lo devi usare con una istanza (CurrentThread).



    Ovviamente ... perche' prima ignorava la tua indicazione ...
    ok grazie

    Originariamente inviato da oregon
    E come?

    Non e' questione di errore ... ma di logica del programma ...

    il bottone per la fine del thread invece di richiamare il metodo abort che non poteva funzionare, ora setta una variabile chiudi_t a true per chiudere il thread t (poi ho messo anche un'altra chiudi_t2 per il thread t2)

    e ho fatto la modifica nella LoopInfinito come segue:

    codice:
    Do While True
    
                If chiudi_t Or chiudi_t2 Then
                    chiudi_t = False
                    Threading.Thread.CurrentThread.Abort()
    
                Else
                    Dim j As Double = 0
                    For j = 0 To 10
                        j += 1
                        j -= 1
                    Next
                    ListBox2.Items.Add("x" & i)
                    i += 1
                    'creo delle pause tra un incremento e l'altro
                    Threading.Thread.Sleep(3000)
                End If
    
            Loop

  7. #7

    Re: Moderazione

    Originariamente inviato da alka
    Il linguaggio va indicato anche nel titolo, come da Regolamento.
    Qui l'ho aggiunto io.
    ah ecco me ne ero dimenticato , di solito lo mettevo , sarà l'orario del topic

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ok ma piuttosto che chiamare la Abort, fai terminare il thread "naturalmente" ... basta che il ciclo non sia infinito ma controllato da quella variabile di cui parli ...

  9. #9
    Originariamente inviato da oregon
    Ok ma piuttosto che chiamare la Abort, fai terminare il thread "naturalmente" ... basta che il ciclo non sia infinito ma controllato da quella variabile di cui parli ...

    ho provato a inserire la chiudi_t nel controllo che fai do while
    ma in questo caso i due thread t e t2 si chiudono insieme
    io mi aspetto che quando clicco sul bottone che setta chiudi_t a true il do while non fa niente
    ed esce , e setta chiudi_t = false in modo che dopo averla settata il thread muore
    e una volta passato il controllo a thread t2, dopo la morte naturale di t, questo continui perchè
    trova chiudi_t = true
    ma ciò non accade, anzi nel debug pare accadere che si chiudono uno dopo l'altro
    c'è qualcosa che non mi torna
    tu la capisci questa cosa? :master:

    codice:
        Private Sub LoopInfinito()
    
            Dim i As Int32 = 0
    
            Do While Not chiudi_t
    
                Dim j As Double = 0
                For j = 0 To 10
                    j += 1
                    j -= 1
                Next
                ListBox2.Items.Add("x" & i)
                i += 1
                'creo delle pause tra un incremento e l'altro
                Threading.Thread.Sleep(3000)
    
            Loop
            chiudi_t = False
    
        End Sub

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Giustamente dato che il codice dei due thread e' condiviso ...

    Se non fosse un problema, potresti usare una LoopInfinito per il primo thread e una LoopInfinito2 per il secondo ...

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.