Vb.Net Seriport meşgul Donma

Başlatan rree, 06 Eylül 2018, 20:33:12

rree

Vb.Net Seriport Üzerinden Bilgi gönderiyorum. Tasarımda 2 timer
ve seriPort mevcut.

Seri porttan art arda veri gönderirken programı kapatma çalıştığımda Program donuyor.
eğer veri gödermez isem yazdığım program normal Olarak kapanıyor.

Private Sub Form_Ana_FormClosed(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles MyBase.FormClosed
        Timer1.Stop()
        TimerA.Stop()
        'SerialPortA.Dispose()
        If Me.SerialPortA.IsOpen Then
            Me.SerialPortA.Close()
        End If

    End Sub

Alıcı Kısım
  DegSeri_Uint8 = SerialPortA.ReadByte
        If Chr(DegSeri_Uint8) = ":" Then
            DegSeriSayac = 0
            For i = 0 To 15
                DegSer_int8diziTemp(i) = 0
            Next
        End If..................
Gönderme
Private Function Plc_N_Oku(ByVal fonksiyon As Byte) As Boolean
        Dim DegCRC As String = ""
        Dim DegSerialTemp As String = ""

        DegSerialTemp = Hex2(DegPlcNo) + Hex2(fonksiyon) + DegPlcFonAdresi + "0008"
        DegSerialTemp = ":" + DegSerialTemp + CrcHesaplaText(DegSerialTemp) + Chr(13)

        If SerialPortA.IsOpen = True Then
            DegSerialStr = DegSerialTemp
            SerialPortA.Write(DegSerialStr + Chr(10))
            Return True
        Else
            Return False
        End If

        Return False
    End Function
Kısaca kodlarım

rree

Şimdilik forma özel kapat butonu tanımladım.
kendi "controlbox" kapattım.
Önerisi olan varmı!


tunayk

#2
1- Form Closing eventini kullanın.
2- Eğer halen donma sorunu yaşarsanız, form closing eventi içinde kapatma olayını engelleyin, sonrasında güvenli olarak kapatma rutinini (kendi yazacağınız fonksiyon) çalıştırın veya seri portun işini bitirmesini beklersiniz .  İşlem sonunda da formu kendiniz kapatın.
3- Thread kullanın.

rree

#3
Private Sub Form_Ana_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
        e.Cancel = True
        Dim Sonuc As Boolean = False
        Timer1.Stop()
        TimerA.Stop()
Tekrar:
        Try
            Sonuc = True
            If Me.SerialPortA.IsOpen Then
                Me.SerialPortA.Close()
            End If
        Catch ex As Exception
            Sonuc = False
        End Try
        If Sonuc = False Then GoTo Tekrar
        e.Cancel = False
    End Sub
End Class
Öneriniz Üzere yukarıdaki kapatma rutinin yazdım.

tunayk

Alıntı yapılan: rree - 07 Eylül 2018, 20:05:55
Private Sub Form_Ana_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
        e.Cancel = True
        Dim Sonuc As Boolean = False
        Timer1.Stop()
        TimerA.Stop()
Tekrar:
        Try
            Sonuc = True
            If Me.SerialPortA.IsOpen Then
                Me.SerialPortA.Close()
            End If
        Catch ex As Exception
            Sonuc = False
        End Try
        If Sonuc = False Then GoTo Tekrar
        e.Cancel = False
    End Sub
End Class
Öneriniz Üzere yukarıdaki kapatma rutinin yazdım.


Sonuç aldınız mı?

rree

Yukarıdaki program yine kilitlendi Şu an yeni yazdığım programı deniyorum.
Private Sub Form_Ana_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
        If DegKapat = True Then e.Cancel = True
        If DegKapat = False Then
            e.Cancel = False
            DegKapatSay = 0
            Timer_Kapat.Start()
        End If

    End Sub

    Private Sub Timer_Kapat_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer_Kapat.Tick
        If DegKapatSay = 1 Then
            Try
                Me.SerialPortA.Close()
                Me.SerialPortA.Dispose()
                DegKapat = True
            Catch ex As Exception
                DegKapat = False
            End Try

            If DegKapat = True Then
                Timer_Kapat.Stop()
                Me.Close()
            End If
            DegKapatSay = DegKapatSay + 1
            If DegKapatSay > 1 Then DegKapatSay = 0
        End If

    End Sub

rree

Yinede kilitlendi immediate satırıda
A first chance exception of type 'System.IO.IOException' occurred in System.dll
Yazıyor.

rree

#7
Problemin yeri belli oldu
   
Private Sub SerialPortA_DataReceived(..........
    Me.Close
Yukarıdaki gibi yazarsam   kilitleniyor.
Aşağıdaki gibi kapatmatmaya çalışırsam kilitlenmiyor.
Aşağıdaki komutu form closing olayına yazarsam fayda etmiyor kilitleniyor.
Private Sub SerialPortA_DataReceived(..........
    SerialPort.close    
    Me.Close
Bir çözüm bulalaım.

kudretuzuner

Merhaba,
Program koşarken kapatmanız sorun yaratıyor gibi geliyor bana.Bana sorarsanız programı kapatma yerine başka bir forma atlayın.Bu arada bu işlev yapılmadan önce normal kendi işini bitirir ve istediğiniz forma geçer diye düşünüyorum.
Amatör

rree

Denedim olumsuz. Garip bir yöntemle çözdüm.
Private Sub Form_Ana_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
        If DegKapatAnahtar = True Then
            e.Cancel = False
        End If
        If DegKapatAnahtar = False Then
            e.Cancel = True
            DegKapatAnahtar = True
            If SerialPortA.IsOpen Then
                SerialPortA.Write("xxxx")
            Else
                e.Cancel = False
            End If
        End If
    End Sub

Reciever olayına
If DegKapatAnahtar = True Then
            Application.DoEvents()
            SerialPortA.Close()
            Me.Close()
        End If