Pantallaso Azul con mi programa.

Iniciado por **Aincrad**, 9 Enero 2019, 00:52 AM

0 Miembros y 1 Visitante están viendo este tema.

**Aincrad**

hola, he codificado un contador de ping en milisegundos. pero aveces hace que el windows se me crashtee y no se la razon.

a alguien ya le ha salido este error antes? el codigo del error dice > "PROCESS_HAS_LOCKED_PAGES"
 

Imagen de mi app >






@Elektro te mando el código por privado, ya que es parte de mi antivirus que ando desarrollando y todavía no publicare código.

gracias de antemano.




Eleкtro

#1
A mi no me aparece ningún BSOD. He probado el programa compilando en modo Debug y Release, terminando el programa de forma normal, terminando de forma abrupta (usando el botón detener en VS), y cerrando Visual Studio. Cero pantallazos azules.

Según un comentario en el siguiente hilo, el cual casualmente es de un usuario que usa Windows 7 como tú, dicen que tras haber visualizado la información de depuración del volcado de memoria del BSOD, han llegado a la conclusión de que se trata de un bug de ese sistema operativo Windows 7...


Cita de: Andre.ZieglerI've previously posted the dumps etc. to another forum here is the link. We came to the conclusion it was a bug in Windows, not the network driver? (considered "solved" of sorts :) See the OSVDB link in the post..

http://www.techsupportforum.com/forums/f217/solved-tcpip-sys-bsod-issue-530767.html

De todas formas en la documentación de Microsoft explican que se trata de un fallo por parte de algún driver instalado en el sistema (un driver de dispositivos de red, supongo, o quizás incluso pueda ser culpa de algún driver o servicio en segundo plano de algún antivirus que puedas tener en ejecución mientras haces ping), y que ocurre cuando el driver no puede liberar páginas (páginas de memoria) bloqueadas despues de una operación de entrata y salida o input/output (I/O), es decir, de una operación de escritura y lectura de las páginas bloqueadas...


Hay te explican además una posible solución.

En caso de que no sea culpa de tu antivirus, yo te propongo otra posible solución: espera a que la operación de ping finalice antes de cerrar completamente el programa.

He revisado tu código y hay varias cosas imperfectas, desde el modo en el que posicionas el Form en la esquina de la barra de tareas mediante un búcle Do While (cuando lo puedes hacer con una simple operación matemática), hasta la implementación del BackgroundWorker que tira excepciones del tipo InvalidOperationException por intentar acceder a un control desde otro thread distinto desde el que fue creado. En fin, le hice algunas modificaciones y ha quedado de la siguiente manera; pruébalo a ver si con suerte te soluciona el problema en tu PC...

Código (vbnet) [Seleccionar]
Imports System.ComponentModel
Imports System.Threading

Public NotInheritable Class Form1

    Private ReadOnly Property HostNameOrAddress As String
        Get
            Return Me.TextBox2?.Text
        End Get
    End Property

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
        Dim scr As Screen = Screen.FromHandle(Me.Handle)
        Me.Location = New Point((scr.WorkingArea.Right - Me.Size.Width), (scr.WorkingArea.Bottom - Me.Size.Height))

        With Me.BackgroundWorker1
            .WorkerReportsProgress = True
            .WorkerSupportsCancellation = True

            .RunWorkerAsync()
        End With
    End Sub

    Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        Dim bgw As BackgroundWorker = DirectCast(sender, BackgroundWorker)

        Do Until bgw.CancellationPending
            Dim elapsed As Double = Me.MedidorPing(Me.HostNameOrAddress, TimeSpan.FromSeconds(5))
            Dim userState As String
            If (elapsed.Equals(Double.NaN)) Then
                userState = "Ping request timed out."
            Else
                userState = String.Format("{0:F0} ms", elapsed)
            End If

            bgw.ReportProgress(Nothing, userState)
        Loop
        bgw.ReportProgress(100, Nothing)
    End Sub

    Sub BackgroundWorker1_ProgressChanged(sender As Object, e As ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
        Me.TextBox3.Text = CStr(e.UserState)
    End Sub

    Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
        Me.Close()
    End Sub

    Private Sub HexCheckBox1_CheckedChanged(ByVal sender As Object) Handles HexCheckBox1.CheckedChanged
        Me.TopMost = Me.HexCheckBox1.Checked
    End Sub

    Private Sub HexButton1_Click(sender As Object, e As EventArgs) Handles HexButton1.Click
        DirectCast(sender, HexButton).Enabled = False

        If (Me.BackgroundWorker1.IsBusy) Then
            Me.BackgroundWorker1.CancelAsync()

            Do While Me.BackgroundWorker1.IsBusy
                Application.DoEvents()
                Thread.Sleep(TimeSpan.FromMilliseconds(100))
            Loop
        End If
    End Sub

    Private Function MedidorPing(ByVal hostNameOrAddress As String, timeout As TimeSpan) As Double

        If String.IsNullOrEmpty(hostNameOrAddress) Then
            Return Double.NaN
        End If

        If Not My.Computer.Network.IsAvailable() Then
            Return Double.NaN
        End If

        Dim sw As New Stopwatch()
        Try
            sw.Start()
            My.Computer.Network.Ping(hostNameOrAddress, CInt(timeout.TotalMilliseconds))
            sw.Stop()
            Return sw.Elapsed.TotalMilliseconds

        Catch ex As Exception ' ArgumentNullException, InvalidOperationException, PingException or SocketException
            Return Double.NaN

        End Try

    End Function

End Class








**Aincrad**

Exelente, con tu código es rápido y ya no me lanza el pantallaso azul al depurar.

grax.