Visual Basic.NET - Problema con do while

   
Vista:

Problema con do while

Publicado por Marcos msanzana@smu.cl (3 intervenciones) el 12/07/2012 17:10:39
Amigos, hace tiempo que tengo esta traba que cuando hago aplicaciones en visual basic 2010 que realizan procesos en donde se tiene que esperar cierto tiempo por ejemplo obtener el modelo y la serie de todas las cajas de un supermercado para almacenarlas en una base de datos , en estos casos quiero colocarle una ventanita que indique por ejemplo "escaneando caja 1...", lo e intentado creando un dialog llamado frm_Escaneo_Pos el cual tiene un label que se llama num_caja y en el do while por cada ciclo le voy asignando el nombre de la caja que se esta revisando en el momento pero sin embargo cuando carga el programa durante todo el escaneo que puede variar desde 30 seg hasta 1 minuto (dependiendo del número de cajas) me muestra el label num_caja en blanco y no me muestra el número de la caja como yo quiero, es como si el programa se quedara pegado durante el proceso, entonces no tengo como mostrar el progreso del escaneo, esta aplicacion es para el area de informática de la empresa donde trabajo y si la entrego asi como esta sin indicar que se esta haciendo mientras se esta escaneando las cajas se puede interpretar como un cuelgue de la aplicación, que otra alternativa tengo amigos de alguna sentencia bucle que no me cuelgue el lbl_cajas, a continuación les detallo el código en donde escanea cada caja:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
Frm_Escaneo_POS.visible=true ' aqui muestro una ventanita que indica que el programa esta escaneando las cajas
 
        'Dim MAC As String
        Do While dr.Read
            'TIPO(contador) = dr.GetString(2)
            'MODELO(contador) = dr.GetString(3)
            'SERIE(contador) = dr.GetString(4)
            IP_Caja = dr.GetString(1)
            IP_POS(contador) = IP_Caja
 
 
            POS = dr.GetString(0)
            lbl_caja.text=POS ' Esta es la parte en donde le asigno el número de la caja para que la muestre en el frm_Escaneo_POS
            'Dim results() As String = Scanner.ResolveMac(Int(dr.GetString(1)))
            Estado = ping.Send(IP_Caja, 1000).Status.ToString
            Estados_P(contador) = Estado
            ' MAC = ping.(dr.GetString(1),200)
            If Estado = "Success" Then
                Imagen = 0
            Else
                Imagen = 1
            End If
 
            ListView1.Items.Add(New ListViewItem(New String() {dr.GetString(0) & " ", dr.GetString(1), Estado, dr.GetString(2), dr.GetString(3), dr.GetString(4), dr.GetString(5), dr.GetString(6), dr.GetString(7)}, Imagen))
 
            contador = contador + 1
        Loop
 
        dr.Close()
 
        For z = 0 To contador - 1
            If Estados_P(z) = "Success" Then
                Shell("cmd /c c:\cscript\psexec.exe \\" & IP_POS(z) & " -u administrador -p unimarc -c " & Chr(34) & "c:\cscript\comm.bat" & Chr(34) & "> c:\cscript\log.log", AppWinStyle.Hide, True, 11000)
 
                Dim objReader As New StreamReader("c:\cscript\log.log")
                Dim sLine As String = ""
                Dim arrText As New ArrayList()
                Do
                    sLine = objReader.ReadLine()
                    If Not sLine Is Nothing Then
                        arrText.Add(sLine)
                    End If
                Loop Until sLine Is Nothing
 
                objReader.Close()
                For Each sLine In arrText
 
                    If Mid(sLine, 1, 6) = "Model:" Then
 
                        Tipo_POS(z) = Mid(sLine, 7, 5)
                        Mod_POS(z) = Mid(sLine, 12, 3)
                    End If
                    If Mid(sLine, 1, 15) = "Serial Number2:" Then
 
                        Serie_POS(z) = Mid(sLine, 16, 9)
 
                    End If
 
                Next
            End If
 
 
        Next
 
        For Each item As ListViewItem In ListView1.Items
 
            item.UseItemStyleForSubItems = False
            If Estados_P(contador2) = "Success" Then
                If item.SubItems(3).Text = Replace(Tipo_POS(contador2), " ", "") Then
 
                    item.SubItems(3).ForeColor = Color.Blue
 
                Else
 
                    item.SubItems(3).ForeColor = Color.Red
 
                End If
 
                If item.SubItems(4).Text = Mod_POS(contador2) Then
 
                    item.SubItems(4).ForeColor = Color.Blue
 
                Else
 
                    item.SubItems(4).ForeColor = Color.Red
 
                End If
 
                If item.SubItems(5).Text = Replace(Serie_POS(contador2), " ", "") Then
 
                    item.SubItems(5).ForeColor = Color.Blue
 
                Else
 
                    item.SubItems(5).ForeColor = Color.Red
 
                End If
            Else
                item.SubItems(3).ForeColor = Color.Gray
                item.SubItems(4).ForeColor = Color.Gray
                item.SubItems(5).ForeColor = Color.Gray
            End If
 
            contador2 = contador2 + 1
        Next
 
 
        Frm_Escaneo_POS.Close()
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Problema con do while

Publicado por David (46 intervenciones) el 12/07/2012 19:49:18
Hola Marcos,
podrias solucionarlo con un BackgroundWorker que basicamente crea un subproceso con tus operaciones

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Private POS As Integer
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        Frm_Escaneo_POS.visible = True
        BackgroundWorker1.RunWorkerAsync()
    End Sub
    Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        'tu codigo aqui
        'Dim MAC As String
        Do While dr.Read
            'TIPO(contador) = dr.GetString(2)
            'MODELO(contador) = dr.GetString(3)
            'SERIE(contador) = dr.GetString(4)
            IP_Caja = dr.GetString(1)
            IP_POS(contador) = IP_Caja
            POS = dr.GetString(0)
            'Dim results() As String = Scanner.ResolveMac(Int(dr.GetString(1)))
            Estado = ping.Send(IP_Caja, 1000).Status.ToString
            Estados_P(contador) = Estado
            ' MAC = ping.(dr.GetString(1),200)
            If Estado = "Success" Then
                Imagen = 0
            Else
                Imagen = 1
            End If
 
            ListView1.Items.Add(New ListViewItem(New String() {dr.GetString(0) & " ", dr.GetString(1), Estado, dr.GetString(2), dr.GetString(3), dr.GetString(4), dr.GetString(5), dr.GetString(6), dr.GetString(7)}, Imagen))
 
            contador = contador + 1
            BackgroundWorker1.ReportProgress(contador)
        Loop
    End Sub
 
    Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As System.Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
        progressbar1.value = e.ProgressPercentage
        lbl_caja.text = POS
    End Sub
 
    Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
        Frm_Escaneo_POS.Close()
    End Sub



no se me ocurre otra cosa
suerte saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema con do while

Publicado por Marcos msanzana@smu.cl (3 intervenciones) el 12/07/2012 19:56:38
Gracias amigo por contestar, probaré la opción que me indicaste
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema con do while

Publicado por Damian (824 intervenciones) el 13/07/2012 14:52:17
También puedes trabajar con los temporizadores (controles Timer), son utilizados para estas cuestiones. Cuando hay procesos o tareas porcesandose, con el Timer y otro control en simultaneo se permite ir mostrando un mensaje o porcentaje de algo. Suele usarse mucho con los progressbar.
Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema con do while

Publicado por marcos msanzana@smu.cl (3 intervenciones) el 13/07/2012 15:11:13
Amigo, al final pude implementar el BackgroundWorker, muchas gracias por tu sugerencia de todos modos, en una oportunidad habia pensado hacerlo con un timer pero resulta que el BackgroundWorker me permite desplegar las cajas primero y mis colegas pueden empesar a trabajar con las cajas sin nesecidad de esperar a que el proceso de recolección de información de las mismas tenga que terminar, me encantó el BackgroundWorker, lo voy a empesar a ocupar, puedes colocar cuantos procesos simultaneos quieras y no se interferirán entre si
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar