Avatar billede agerled Nybegynder
08. juni 2005 - 20:19 Der er 7 kommentarer og
1 løsning

Køre Sub i thread

Hej. Jeg bruger nedenstående kode til at tilføje grupper og treeviews til min menu. Den henter en del data så den er lang tid om at starte op....(layoutet er meget forsinket). Hvordan løser jeg dette bedst så grafikken kommer frem med det samme.

Kan jeg evnt kører den i en thread i baggrunden? Hvis ja så hvordan?

Private Sub InitializeMenu()

        Dim YearSQL As OracleDataReader
        Dim DateSQL As OracleDataReader
        Dim MonthSQL As OracleDataReader
        Dim DatasetSQL As OracleDataReader

        Dim Hitrate As Group
        Dim HitrateOverblik As Group
        Dim ListeNumre As Group
        Dim Funktioner As Group

        Hitrate = Navigator.Groups.Add("Hitrate")
        Hitrate.Image = Image.FromFile("img/stats.ico")

        HitrateOverblik = Navigator.Groups.Add("Hitrate overblik")
        HitrateOverblik.Image = Image.FromFile("img/stats.ico")

        Dim HitrateDetailPanel As GroupPanel = New GroupPanel

        HitrateDetailPanel.BackColor = Color.White
        HitrateDetailPanel.Height = "200"
        HitrateDetailPanel.Visible = True
        HitrateDetailPanel.Controls.Add(lstDetails)
        lstDetails.Dock = DockStyle.Fill
        Hitrate.Panel = HitrateDetailPanel

        ListeNumre = Navigator.Groups.Add("Dine numre på listen")
        ListeNumre.Image = Image.FromFile("img/stats.ico")
        Funktioner = Navigator.Groups.Add("Funktioner")
        Funktioner.Image = Image.FromFile("img/stats.ico")


        Dim Agents As Node
        Dim AgentsNode As Node
        Dim DatasetNode As Node
        Dim YearNode As Node
        Dim MonthNode As Node
        Dim DateNode As Node

        Try

            Dim DatasetCount As Integer = 0
            Dim YearCount As Integer = 0
            Dim MonthCount As Integer = 0
            Dim i As Integer = 0
            Dim Dato As Date
            Dim DatasetImage As String

            DatasetSQL = DBCommands.ExecuteSQL("select dataset from hitrate group by dataset", DBCommands.DBConnection.OracleDrift).executereader

            While DatasetSQL.Read = True

                YearSQL = DBCommands.ExecuteSQL("select extract(year from dato) as HitYear from hitrate where dataset = '" & DatasetSQL.Item("dataset") & "' group by extract(year from dato) order by extract(year from dato) DESC", DBCommands.DBConnection.OracleDrift).executereader

                DatasetNode = Hitrate.Nodes.Add(DatasetSQL.Item("dataset"))


                If DatasetSQL.Item("dataset") = "DAT" Then
                    DatasetImage = "img/flag_dk.gif"
                ElseIf DatasetSQL.Item("dataset") = "SE" Then
                    DatasetImage = "img/flag_se.gif"
                ElseIf DatasetSQL.Item("dataset") = "NO" Then
                    DatasetImage = "img/flag_no.gif"
                End If

                Hitrate.Nodes(DatasetCount).Image = Image.FromFile(DatasetImage)

                While YearSQL.Read = True

                    YearNode = DatasetNode.Nodes.Add(YearSQL.Item("hityear"))
                    YearNode.Image = Image.FromFile("img/database_options.ico")


                    MonthSQL = DBCommands.ExecuteSQL("select extract(month from dato) as HitMonth from hitrate where dataset = '" & DatasetSQL.Item("dataset") & "' and extract(year from dato) = " & YearSQL.Item("hityear") & " group by extract(month from dato) order by extract(month from dato) DESC", DBCommands.DBConnection.OracleDrift).executereader
                    While MonthSQL.Read = True
                        MonthNode = DatasetNode.Nodes(YearCount).Nodes.Add(MonthName(MonthSQL.Item("HitMonth"), False))
                        MonthNode.Image = Image.FromFile("img/table.ico")


                        For i = 1 To Date.Today.DaysInMonth(YearSQL.Item("hityear"), MonthSQL.Item("hitmonth"))
                            Dato = i & "-" & MonthSQL.Item("hitmonth") & "-" & YearSQL.Item("hityear")


                            If Dato <= Date.Today Then

                                DateNode = DatasetNode.Nodes(YearCount).Nodes(MonthCount).Nodes.Add(Dato)

                            Else
                                Exit For
                            End If



                        Next

                        MonthCount = MonthCount + 1

                    End While

                    MonthCount = 0

                    YearCount = YearCount + 1

                End While
                YearCount = 0
                DatasetCount = DatasetCount + 1


            End While

        Catch exp As Exception
            MsgBox(exp.Message)

        Catch exp As OracleException

            MsgBox(exp.Message)
        End Try


        Hitrate.Select()
        Hitrate.Nodes(0).IsExpanded = True
        Hitrate.Nodes(0).Nodes(0).IsExpanded = True
        Hitrate.Nodes(0).Nodes(0).Nodes(0).IsExpanded = True
        Dim NodeAntal As Integer = Hitrate.Nodes(0).Nodes(0).Nodes(0).Nodes.Count
        Hitrate.Nodes(0).Nodes(0).Nodes(0).Nodes(NodeAntal - 1).IsSelected = True


        YearSQL.Close()
        YearSQL.Dispose()
        MonthSQL.Close()
        MonthSQL.Dispose()
        DatasetSQL.Close()
        DatasetSQL.Dispose()


    End Sub
Avatar billede burningice Nybegynder
08. juni 2005 - 20:22 #1
Det er utrolig nemt at arbejde med tråde i .Net

Prøv følgende fra hvor du kalder InitializeMenu:

Dim t As Thread = New Thread(New ThreadStart(InitializeMenu))
t.Start()
Avatar billede agerled Nybegynder
08. juni 2005 - 20:39 #2
hej

Jeg har prøvet dit eksempel, men så kommer alt fra

....
Dim HitrateDetailPanel As GroupPanel = New GroupPanel

        HitrateDetailPanel.BackColor = Color.White
        HitrateDetailPanel.Height = "200"
        HitrateDetailPanel.Visible = True
        HitrateDetailPanel.Controls.Add(lstDetails)
        lstDetails.Dock = DockStyle.Fill
        Hitrate.Panel = HitrateDetailPanel

        ListeNumre = Navigator.Groups.Add("Dine numre på listen")
        ListeNumre.Image = Image.FromFile("img/stats.ico")
        Funktioner = Navigator.Groups.Add("Funktioner")
        Funktioner.Image = Image.FromFile("img/stats.ico")


        Dim Agents As Node
        Dim AgentsNode As Node
        Dim DatasetNode As Node
        Dim YearNode As Node
        Dim MonthNode As Node
        Dim DateNode As Node

        Try

            Dim DatasetCount As Integer = 0
            Dim YearCount As Integer = 0
            Dim MonthCount As Integer = 0
            Dim i As Integer = 0
            Dim Dato As Date
            Dim DatasetImage As String

            DatasetSQL = DBCommands.ExecuteSQL("select dataset from hitrate group by dataset", DBCommands.DBConnection.OracleDrift).executereader

            While DatasetSQL.Read = True

                YearSQL = DBCommands.ExecuteSQL("select extract(year from dato) as HitYear from hitrate where dataset = '" & DatasetSQL.Item("dataset") & "' group by extract(year from dato) order by extract(year from dato) DESC", DBCommands.DBConnection.OracleDrift).executereader

                DatasetNode = Hitrate.Nodes.Add(DatasetSQL.Item("dataset"))


                If DatasetSQL.Item("dataset") = "DAT" Then
                    DatasetImage = "img/flag_dk.gif"
                ElseIf DatasetSQL.Item("dataset") = "SE" Then
                    DatasetImage = "img/flag_se.gif"
                ElseIf DatasetSQL.Item("dataset") = "NO" Then
                    DatasetImage = "img/flag_no.gif"
                End If

                Hitrate.Nodes(DatasetCount).Image = Image.FromFile(DatasetImage)

                While YearSQL.Read = True

                    YearNode = DatasetNode.Nodes.Add(YearSQL.Item("hityear"))
                    YearNode.Image = Image.FromFile("img/database_options.ico")


                    MonthSQL = DBCommands.ExecuteSQL("select extract(month from dato) as HitMonth from hitrate where dataset = '" & DatasetSQL.Item("dataset") & "' and extract(year from dato) = " & YearSQL.Item("hityear") & " group by extract(month from dato) order by extract(month from dato) DESC", DBCommands.DBConnection.OracleDrift).executereader
                    While MonthSQL.Read = True
                        MonthNode = DatasetNode.Nodes(YearCount).Nodes.Add(MonthName(MonthSQL.Item("HitMonth"), False))
                        MonthNode.Image = Image.FromFile("img/table.ico")


                        For i = 1 To Date.Today.DaysInMonth(YearSQL.Item("hityear"), MonthSQL.Item("hitmonth"))
                            Dato = i & "-" & MonthSQL.Item("hitmonth") & "-" & YearSQL.Item("hityear")


                            If Dato <= Date.Today Then

                                DateNode = DatasetNode.Nodes(YearCount).Nodes(MonthCount).Nodes.Add(Dato)

                            Else
                                Exit For
                            End If



                        Next

                        MonthCount = MonthCount + 1

                    End While

                    MonthCount = 0

                    YearCount = YearCount + 1

                End While
                YearCount = 0
                DatasetCount = DatasetCount + 1


            End While

        Catch exp As Exception
            MsgBox(exp.Message)

        Catch exp As OracleException

            MsgBox(exp.Message)
        End Try


        Hitrate.Select()
        Hitrate.Nodes(0).IsExpanded = True
        Hitrate.Nodes(0).Nodes(0).IsExpanded = True
        Hitrate.Nodes(0).Nodes(0).Nodes(0).IsExpanded = True
        Dim NodeAntal As Integer = Hitrate.Nodes(0).Nodes(0).Nodes(0).Nodes.Count
        Hitrate.Nodes(0).Nodes(0).Nodes(0).Nodes(NodeAntal - 1).IsSelected = True
...

ikke med....???
Avatar billede agerled Nybegynder
08. juni 2005 - 20:45 #3
Det er denne jeg har prøvet:

Dim t = New Threading.Thread(AddressOf InitializeMenu)
t.start()
Avatar billede burningice Nybegynder
10. juni 2005 - 10:54 #4
Dvs. at kun noget af metoden du starter i en ny tråd bliver udført, eller hvordan skal det forstås at det ikke kommer med?
Avatar billede agerled Nybegynder
10. juni 2005 - 16:54 #5
ja sådan kan man godt sige det..
Avatar billede burningice Nybegynder
25. juni 2005 - 12:47 #6
hm... umiddelbart vil jeg sige at det er fordi at din metode fejler et sted og derfor dør, men jeg kan ikke umiddelbart se hvorfor at din kode skulle kunne fejle.
Avatar billede agerled Nybegynder
07. oktober 2005 - 20:58 #7
tak for hjælpen. læg et svar.
Avatar billede burningice Nybegynder
26. oktober 2005 - 20:22 #8
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester