• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

watt

[VB.NET 2005] Pq é q os thread deixam de trabalhar

5 mensagens neste tópico

Boa noite!

No meu jogo estou comoutro problema, agora qd estou a correr jogos em simultanio, há th reads q deixam de rtabalhar sem xegar ao tempo total de jogo.

tenho as estas variaveis e mais umas ...

    Public timef(1000), timen(1000) As Date

    'Variaveis gerais
    Public njogos As Integer = 0
    Public iplista, nomlista As New ArrayList
    Public threadjogos(1000) As System.Threading.Thread
    Public emjogo(1000, 5),tempjog(1000) As String



------ verifico se há jogo e façoumnovo thread --------------------------------
       Dim data As Date = Date.Now
        Dim x As Integer
        tempinicio = Date.Now.TimeOfDay.Hours.ToString & ":" & Format(Int(Date.Now.TimeOfDay.Minutes.ToString), "00")
        sql1 = "select * from jogos where data='" & data.Date & "' and hora='" & tempinicio & "' and estado <> 'S'"
        ligacao.ligacao1.Close()
        ligacao.ligacao1.Open()
        ligacao.cmdsql1 = New MySql.Data.MySqlClient.MySqlCommand(sql1, ligacao.ligacao1)
        ligacao.var1 = cmdsql1.ExecuteReader

        While ligacao.var1.Read
            njogos = njogos + 1
            emjogo(njogos, 1) = var1("equipa1")
            emjogo(njogos, 2) = var1("equipa2")
            emjogo(njogos, 3) = var1("id")

            sql = "UPDATE jogos Set estado='S' where id ='" & emjogo(njogos, 3) & "'"
            ligacao.ligacao.Close()
            ligacao.ligacao.Open()
            ligacao.cmdsql = New MySql.Data.MySqlClient.MySqlCommand(sql, ligacao.ligacao)
            cmdsql.ExecuteNonQuery()
            ligacao.ligacao.Close()

            threadjogos(njogos) = New Thread(AddressOf osjogos)
            threadjogos(njogos).Start()
            threadjogos(njogos).Sleep(50)


        End While
        ligacao.ligacao1.Close()


sub osjogos()
Dim meunumero As Integer = njogos

Depois de carregar nomes e caracteristicas dos jogadores, então começa o jogo



            'iniciar o jogo ------------------------------------------------------------------
            While Not timef(meunumero) = timen(meunumero)
                timen(meunumero) = Date.Now
                minutos = ((90 + descontos) - 1) - DateDiff(DateInterval.Minute, timen(meunumero), timef(meunumero))
                segundos = 59 - (DateDiff(DateInterval.Second, timen(meunumero), timef(meunumero)) Mod 60)

                tempjog(meunumero) = Format(minutos, "00") & ":" & Format(segundos, "00")

                Dim loc As Integer
                Randomize()
                asorte = (Rnd() * aleatorios)

                'equipa1
                If asorte >= 0 And asorte <= skillequipa(meunumero, 1) Then
                    loc = 1
                    qataca = "1"
                    Randomize()
                    y = Int(Rnd() * 1200)

                    If y >= 0 And y <= 150 Then
                        Tdefesa(1, meunumero)
                    End If
                    If y >= 150 And y <= 1000 Then
                        Tmcampo(1, meunumero)
                    End If
                    If y >= 1000 And y <= 1200 Then
                        Tataque(1, meunumero)

                    End If


                    'equipa2
                ElseIf asorte >= (aleatorios - skillequipa(meunumero, 2)) And asorte <= aleatorios Then
                    loc = 3
                    qataca = "2"
                    Randomize()
                    y = Int(Rnd() * 1200)

                    If y >= 0 And y <= 150 Then
                        Tdefesa(2, meunumero)
                    End If
                    If y >= 150 And y <= 1000 Then
                        Tmcampo(2, meunumero)
                    End If
                    If y >= 1000 And y <= 1200 Then
                        Tataque(2, meunumero)
                    End If


                Else
                    loc = 2
                End If
                '-------------> Velocidade do jogo <-----------
                threadjogos(meunumero).Sleep(1000)




                'Fim de jogo
                If timef(meunumero) <= timen(meunumero) Then
                    sql = "UPDATE jogos Set tempoJog='" & tempjog(meunumero) & "', estado='F' where id ='" & emjogo(meunumero, 3) & "'"
                    ligacao.ligacao.Close()
                    ligacao.ligacao.Open()
                    ligacao.cmdsql = New MySql.Data.MySqlClient.MySqlCommand(sql, ligacao.ligacao)
                    cmdsql.ExecuteNonQuery()
                    ligacao.ligacao.Close()
                    threadjogos(meunumero).Abort()
                End If

            End While

end sub

depois os jogos ficam por acabar, aguns duran apenas segundos e poucos mais... mas se meter um só jogo fui até ao fim.

alguem me pode ajudar ???  agradecia mt

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

que estrutura mais perigosa e esquesita que tens aqui :

por cada interacção no ciclo tu abres e fechas, voltas a abrir e voltas a fechar e crias uma thread nova

1000 threads que tens definidas na estrutura de threads nas variáveis globais

não admira que não funcione

  While ligacao.var1.Read
            njogos = njogos + 1
            emjogo(njogos, 1) = var1("equipa1")
            emjogo(njogos, 2) = var1("equipa2")
            emjogo(njogos, 3) = var1("id")

            sql = "UPDATE jogos Set estado='S' where id ='" & emjogo(njogos, 3) & "'"
            ligacao.ligacao.Close()
            ligacao.ligacao.Open()
            ligacao.cmdsql = New MySql.Data.MySqlClient.MySqlCommand(sql, ligacao.ligacao)
            cmdsql.ExecuteNonQuery()
            ligacao.ligacao.Close()

            threadjogos(njogos) = New Thread(AddressOf osjogos)
            threadjogos(njogos).Start()
            threadjogos(njogos).Sleep(50)


        End While

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

 While ligacao.var1.Read
            njogos = njogos + 1
            emjogo(njogos, 1) = var1("equipa1")
            emjogo(njogos, 2) = var1("equipa2")
            emjogo(njogos, 3) = var1("id")

            sql = "UPDATE jogos Set estado='S' where id ='" & emjogo(njogos, 3) & "'"
            ligacao.ligacao.Close()
            ligacao.ligacao.Open()
            ligacao.cmdsql = New MySql.Data.MySqlClient.MySqlCommand(sql, ligacao.ligacao)
            cmdsql.ExecuteNonQuery()
            ligacao.ligacao.Close()

            threadjogos(njogos) = New Thread(AddressOf osjogos)
            threadjogos(njogos).Start()
            threadjogos(njogos).Sleep(50)


        End While

eu queria criar uma nova thread e e adormecela por 50 milesimos de segundo.

mas não apagar.

só faço o abort aos 90 e tal minutos.

mas já agora que tipo de codigo sugeres??

EDIT: Da próxima, usem a ferramenta GeSHi para postarem o código!! (Ass. bk@ero)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu não percebo a lógica do teu jogo, que jogo afinal pretendes fazer

O que sei é que lançar Threads por cada interacção de ciclo é um disparate, criar uma estrutura de 1000 Threads !?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

hummm... a minha ideia era só ir iniciando um thread por jogo. mas nao sei qd e qts jogos vao começar.

Como é q meto o seguinte código a correr em simultâneo ??? como se fossem vários threads ao mesmo tempo

sub osjogos()
Dim meunumero As Integer = njogos

Depois de carregar nomes e caracteristicas dos jogadores, então começa o jogo



            'iniciar o jogo ------------------------------------------------------------------
            While Not timef(meunumero) = timen(meunumero)
                timen(meunumero) = Date.Now
                minutos = ((90 + descontos) - 1) - DateDiff(DateInterval.Minute, timen(meunumero), timef(meunumero))
                segundos = 59 - (DateDiff(DateInterval.Second, timen(meunumero), timef(meunumero)) Mod 60)

                tempjog(meunumero) = Format(minutos, "00") & ":" & Format(segundos, "00")

                Dim loc As Integer
                Randomize()
                asorte = (Rnd() * aleatorios)

                'equipa1
                If asorte >= 0 And asorte <= skillequipa(meunumero, 1) Then
                    loc = 1
                    qataca = "1"
                    Randomize()
                    y = Int(Rnd() * 1200)

                    If y >= 0 And y <= 150 Then
                        Tdefesa(1, meunumero)
                    End If
                    If y >= 150 And y <= 1000 Then
                        Tmcampo(1, meunumero)
                    End If
                    If y >= 1000 And y <= 1200 Then
                        Tataque(1, meunumero)

                    End If


                    'equipa2
                ElseIf asorte >= (aleatorios - skillequipa(meunumero, 2)) And asorte <= aleatorios Then
                    loc = 3
                    qataca = "2"
                    Randomize()
                    y = Int(Rnd() * 1200)

                    If y >= 0 And y <= 150 Then
                        Tdefesa(2, meunumero)
                    End If
                    If y >= 150 And y <= 1000 Then
                        Tmcampo(2, meunumero)
                    End If
                    If y >= 1000 And y <= 1200 Then
                        Tataque(2, meunumero)
                    End If


                Else
                    loc = 2
                End If
                '-------------> Velocidade do jogo <-----------
                threadjogos(meunumero).Sleep(1000)




                'Fim de jogo
                If timef(meunumero) <= timen(meunumero) Then
                    sql = "UPDATE jogos Set tempoJog='" & tempjog(meunumero) & "', estado='F' where id ='" & emjogo(meunumero, 3) & "'"
                    ligacao.ligacao.Close()
                    ligacao.ligacao.Open()
                    ligacao.cmdsql = New MySql.Data.MySqlClient.MySqlCommand(sql, ligacao.ligacao)
                    cmdsql.ExecuteNonQuery()
                    ligacao.ligacao.Close()
                    threadjogos(meunumero).Abort()
                End If

            End While

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora