Прогресс бар потоков в vb.net - PullRequest
0 голосов
/ 07 июня 2011
Imports CrystalDecisions.CrystalReports.Engine
Imports CrystalDecisions.ReportSource
Imports CrystalDecisions.Shared
Imports System.Data.SqlClient
Imports CrystalDecisions.Windows.Forms
Imports System.Configuration
Imports System.Threading
Public Class frmPurchaseAnalysis
    Dim dA1 As New SqlDataAdapter
    Dim dS1 As New DataSet
    Dim fmRptStr As String
    Dim lCnt As Integer
    Dim stritm As String
    Dim strwrk As String


    Private Sub frmPurchaseAnalysis_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load



        'Itemmtype
        dA1 = New SqlDataAdapter("Select ItemTypeID,ItemType from ItemTypeRoot order by ItemTypeID ", cnnDbOne)
        dA1.Fill(dS1)
        cmbItemType.Items.Add("Select ItemType")

        For lCnt = 0 To dS1.Tables(0).Rows.Count - 1
            SmQryStr = Mid(dS1.Tables(0).Rows(lCnt)("ItemType"), 1, 30)
            SmQryStr &= Space(31 - SmQryStr.Length) & dS1.Tables(0).Rows(lCnt)("ItemTypeID")
            cmbItemType.Items.Add(SmQryStr)
        Next
        cmbItemType.SelectedIndex = 0
        dS1.Clear()
        dA1.Dispose()

    End Sub

    Private Sub cmdExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdExit.Click
        Me.Dispose()
        Me.Close()
    End Sub

    Public Sub cmdView_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdView.Click
        Dim Obj1 As New Thread(AddressOf T1)
        Dim Obj2 As New Thread(AddressOf T2)
        Obj1.Start()
        Obj2.Start()

        Dim strwrk As String
        strwrk = txtdays.Text
        If cmbItemType.Text <> "Select ItemType" And cmbItemType.Text <> "" Then
            stritm = Mid(cmbItemType.Text, 32)
        End If
        SmSqlCmd = New SqlCommand
        SmSqlCmd.Connection = cnnDbOne
        SmSqlCmd.CommandTimeout = 200
        SmSqlCmd.CommandType = CommandType.StoredProcedure
        SmSqlCmd.CommandText = "Rpt_PurchaseAnalysis"
        SmSqlCmd.Parameters.AddWithValue("@itemType", stritm)
        SmSqlCmd.Parameters.AddWithValue("@Targetdays", strwrk)
        SmSqlCmd.Parameters.AddWithValue("@enddate", Format(DTP2.Value, "MM/dd/yyyy"))

        dA1 = New SqlDataAdapter(SmSqlCmd)
        dS1.Clear()
        dA1.Fill(dS1)



    End Sub
    Private Sub T1()
        Dim i As Integer
        i += 1
        PrgrsBar.Value = i
        If PrgrsBar.Value = PrgrsBar.Maximum Then

        End If
    End Sub

    Private Sub T2()

        Dim SmReport As ReportDocument
        Try
            SmReport = New RptPurchaseAnalysis
            SmReport.SetDataSource(dS1.Tables(0))
            SmReport.DataDefinition.FormulaFields("StartDate").Text = """" + Format(DTP1.Value, "dd-MMM-yyyy") + """"
            SmReport.DataDefinition.FormulaFields("enddate").Text = """" + Format(DTP2.Value, "dd-MMM-yyyy") + """"

            Dim frmRptViewer As New frmRptViewer
            frmRptViewer.CrRptVwer1.ReportSource = SmReport
            frmRptViewer.Show()
            dS1.Clear()

        Catch ex As Exception
            MsgBox("Some Reporting Error Has Been Occured. " + vbCrLf + ex.Message, MsgBoxStyle.Information, "Sales Statistics Reporting")
        End Try

    End Sub

End Class

Скажите мне, где я сделал неправильный код ???я хочу показать увеличение индикатора выполнения, пока загружен мой отчет

Ответы [ 2 ]

2 голосов
/ 07 июня 2011

Вы должны быть осторожны, когда имеете дело с GUI и потоками.

Доступ к элементам управления Windows Forms не является поточно-ориентированным. Если у вас есть два или более потоков, управляющих состоянием элемента управления, можно перевести элемент управления в несогласованное состояние.

Самый простой способ обновить элементы управления в другом потоке - это использовать Background Worker . Вы можете прочитать больше в этой статье .

class Program
{
  static BackgroundWorker _bw = new BackgroundWorker();

  static void Main()
  {
    _bw.DoWork += bw_DoWork;
    _bw.RunWorkerAsync ("Message to worker");
    Console.ReadLine();
  }

  static void bw_DoWork (object sender, DoWorkEventArgs e)
  {
    // This is called on the worker thread
    Console.WriteLine (e.Argument);        // writes "Message to worker"
    // Perform time-consuming task...
  }
}
1 голос
/ 07 июня 2011

Я вижу (по крайней мере) следующие проблемы в вашем коде:

  • Вы выполняете длительную операцию (загрузку данных из базы данных) в главном потоке. Это неверно. Поскольку только основной поток может обновлять пользовательский интерфейс, вам нужно выполнить ваши действия с ProgressBar в основном потоке, а операцию с базой данных - в фоновом потоке.

  • В начале cmdView_Click вы запускаете поток T2, который читается как dS1. Однако dS1 пока недоступен, поскольку он просто заполняется в главном потоке.

  • Я не совсем понимаю, что вы пытаетесь сделать в T1: вы инициализируете i (0), затем увеличите его до 1 (i += 1), затем выполните пустой оператор if ...

Я бы посоветовал вам внимательно взглянуть на один из онлайновых руководств по отображению индикатора выполнения в WinForms при выполнении фоновой операции, читать его до полного понимания (не стесняйтесь задавать более конкретный вопрос по StackOverflow). здесь, если вы не понимаете его части), а затем повторите попытку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...