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
Şimdilik forma özel kapat butonu tanımladım.
kendi "controlbox" kapattım.
Önerisi olan varmı!
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.
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.
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ı?
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
Yinede kilitlendi immediate satırıda
A first chance exception of type 'System.IO.IOException' occurred in System.dll
Yazıyor.
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.
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.
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