18 Eylül 2018, 23:15:22

Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME


Vb.Net Seriport meşgul Donma

Başlatan rree, 06 Eylül 2018, 23: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.

Kod Seç
 Private Sub Form_Ana_FormClosed(ByVal sender As System.ObjectByVal e As System.Windows.Forms.FormClosedEventArgsHandles 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
Kod Seç
  DegSeri_Uint8 SerialPortA.ReadByte
        
If Chr(DegSeri_Uint8) = ":" Then
            DegSeriSayac 
0
            
For 0 To 15
                DegSer_int8diziTemp
(i) = 0
            Next
        End 
If..................
Gönderme
Kod Seç
 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

07 Eylül 2018, 16:02:49 #2 Son düzenlenme: 07 Eylül 2018, 16:03:57 tunayk
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

07 Eylül 2018, 23:05:55 #3 Son düzenlenme: 07 Eylül 2018, 23:21:32 rree
Kod Seç
 Private Sub Form_Ana_FormClosing(ByVal sender As System.ObjectByVal e As System.Windows.Forms.FormClosingEventArgsHandles 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, 23:05:55
Kod Seç
 Private Sub Form_Ana_FormClosing(ByVal sender As System.ObjectByVal e As System.Windows.Forms.FormClosingEventArgsHandles 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.
Kod Seç
Private Sub Form_Ana_FormClosing(ByVal sender As System.ObjectByVal e As System.Windows.Forms.FormClosingEventArgsHandles 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.ObjectByVal e As System.EventArgsHandles 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

09 Eylül 2018, 03:14:51 #7 Son düzenlenme: 09 Eylül 2018, 12:18:37 rree
Problemin yeri belli oldu
   
Kod Seç
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.
Kod Seç
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.
Kod Seç
Private Sub Form_Ana_FormClosing(ByVal sender As System.ObjectByVal e As System.Windows.Forms.FormClosingEventArgsHandles 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
Kod Seç
 If DegKapatAnahtar True Then
            Application
.DoEvents()
            
SerialPortA.Close()
            
Me.Close()
        
End If