Aplikace je funkční, ale po určité době zatuhne   zodpovězená otázka

VB.NET

Žádám vás o radu s následujícím problémem.

Ve Visual Studiu 2008 s Net.Frameworkem 3.5 jsem vytvořil docházkovou aplikaci. Aplikace čte data z RFID usb čtečky, pracuje s MYSQL. Vše funguje jak má.

Ale při běhu aplikace dojde k zatuhnutí z ničeho nic( Aniž by zrovna probýhalo čtení z databáze apod.). Aplikace na nic nereaguje a musí být ukončena pomocí správce úloh.

Ve správci úloh není zobrazeno, že aplikace neodpovídá.

Aplikaci pak znovu spustím a běží bez problému.

Ovšem dokud nedoje opět k náhodnému zaseknutí.

Nenapadá někoho v čem by mohla být chyba ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Skúste aplikáciu odladiť.Spustíte to cez Visual Studio a keď zamrzne, skúste dať Debug->BreakAll a potom Debug->Step Into až kým Vám nebude jasné, kde sa to zaseklo.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Prošel sem to krok po kroku, ale opravdu nevidím místo kde by to mohlo ztroskotat.

Jak říkám, celou dobu vše funguje jak má a najednou z ničeho nic dojde k pádu aplikace.

Uživatelé kliknou na tlačítko příchod, přiloží čip a dveře se otevřou. A to je pořád dokola.

Nevytuhne to ani během ověřování a zápisu příchodu v databázi MYSQL.

Stane se to nejčastěji když systém jen prostě čeká až zase někdo stiskne tlačítko příchodu, ale ani tam není nic kvůli čemu by měla aplikace zatuhnout.

Maximálně co mě ještě napadlo je že systém otevře spojení s databází provede oveření a zápis dat a spojení pouze uspí pomocí

conn.dispose()

aby nemusel pokaždé znovu navazovat spojení s databází.

Ale to je tak poslední možnost kterou by to mohlo být.

Pro zatím sem to dnes začal řešit extérní aplikací, které se docházkový program periodicky musí ozvat. Pokud tak neučiní je externím programem uzavřena a znovu nastartována.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jakým způsobem pracujete se čtečkou RFID? Co je to za čtečku?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Prostřednictvým sériového portu.

Program otevře port, načte data z čipu, port zavře a pak začne data porovnávat s databází.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zajímá mě způsob ovládání čtečky a její výrobce - to máte nějaké vlastní řešení, nebo používáte SDK od příslušných výrobců? Chyba by totiž mohla být právě tam.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Z čeho usujete, že chyba pochází ze čtečky ?

Aplikace se zasekne i když je port čtečky uzavřen a tudíž s ní program nepracuje.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ne ze čtečky, ale z kódu pro komunikaci s ní. Pokud používáte vlastní řešení, nebo čtečky pochybných výrobců kde SDK nestojí za nic, nemusí být chyba ve vašem kódu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

http://www.flajzar.cz/pristupove-systemy...

je to tahle čtečka akorát je na usb. V počítači je emulace na COM ke kterému přistupuje docházka....

A je pravda, že se teď i párkrát zasekla docházka při přečtení dat z karty.

Interval mezi dalším pádem se zvětší když se řtečka zrestartuje.

Takže je to možná vážně ní. Ale proč program vymrzne i když čtečka není používána ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Vždyť vám neustále říkám, že záleží na kódu, pomocí kterého čtečka komunikuje. Pokud to má nějaké prasácky napsané API, tak stačí aby se vytvořila instance třídy pro práci se čtečkou, ta zůstane v paměti i po jejím uvolnění nebo tam někde zůstane mrtvé běžící vlákno a je na problémy zaděláno. Já používám zásadně vysoce kvalitní čtečky Intermec a Motorola, které mají prvotřídní a odladěné SDK.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Z ekonomických důvodů jsme si dražší čtečky nemohly dovolit.

Dá se nějak programově tento jev ošetřit ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Takto čtu data za čtečky:

Dim myPort As Array 'COM Ports detected on the system will be stored here

Delegate Sub SetTextCallback(ByVal [text] As String)

tohle pod sebou skrývá tlačítko:

Private Sub btnConnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

Button8.Enabled = True

rtbreceived.Text = ""

SerialPort1.Close() ' Pokud port zůstal otevřen tak jej zavře

SerialPort1.PortName = "COM10" 'Set SerialPort1 to the selected COM port at startup

SerialPort1.BaudRate = "9600" 'Set Baud rate to the selected value o

'Other Serial Port Property

SerialPort1.Parity = IO.Ports.Parity.None

SerialPort1.StopBits = IO.Ports.StopBits.One

SerialPort1.DataBits = 8 'Open our serial port

SerialPort1.Open()

Timer1.Enabled = True ' Po přijmutí dat ze čtečky port zavře

End Sub

Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived

ReceivedText(SerialPort1.ReadExisting()) 'Automatically called every time a data is received at the serialPort

End Sub

Private Sub ReceivedText(ByVal [text] As String)

'compares the ID of the creating Thread to the ID of the calling Thread

If Me.rtbreceived.InvokeRequired Then

Dim x As New SetTextCallback(AddressOf ReceivedText)

Me.Invoke(x, New Object() {(text)})

Else

Me.rtbreceived.Text &= [text]

Label1.Text = "ČIP NAČTEN"

Button8.Enabled = False

Timer1.Enabled = True

Label12.Text = sec

End If

End Sub

a nakonec timer který zajistí 100 % zavření portu a spuštění ověřování

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

sec = sec + 0

Label12.Text = sec

If Label12.Text = "0" Then

Timer1.Stop()

Label12.Text = "0"

sqaccess()

SerialPort1.Close()

End If

sec = 0

End Sub

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak sem ještě zkusil restartovat MYSQL stroj na němž docházka ověřuje čipy a zapisuje do něj data.

Docházkové terminály se zatím drží...

Dnes už v práci končím tak dám ráno vědět jak to dopadlo

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Důležité je také mít v aplikaci tracing a logovat všechny nestandardní stavy, které by mohly vést k vyjímkám. To se pak později velmi hodí k určení příčin různých chyb.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Jakmile se aplikace zasekne, zkuste udělat z task manageru crash dump a podívat se na něj přes windbg a sos.

Dá se zjistit třeba call stack jednotlivých vláken. Možná z toho vyčtete, kde se to zaseklo.

Jen pozor, ten dump může mít stovky MB.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak se to seklo dneska ráno. Pár příchodů se povolilo, ale zase to zatuhlo ...

Začínám propadat beznaději.

Ten dump zkusím provést hned jak najdu nějaký návod.

Stane se to mezi tím když čtečka načte data a pak se mají ověřit data z databáze.

Jestli to skutečně nemůže být chyba při načítání z databáze ?

Konkrétně jestli nemůže být problém s connection.dispose ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak s tou samotnou metodou rozhodně problém nebude. Leda že byste se někde snažil použít ten Connection když už je uklizený z paměti (disposed) - typický případ u globálních proměnných.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Asi sem už našel kde je problém. V kódu který jsem sem poslal je vidět proces načítání dat ze čtečky...

Jenomže tím jak sem pořád rutijně procházel sem přehlídl, že docházka otevře port čtečky, načte data, vsoupí do databáze vykoná vše co má a až na úplný závěr užavře port čtečky.

A to je pravděpodně ten problém.

Chybu sem opravil, teď čtečka skutečně data načte, následovně se její port uzavře a pak nastupuje databáze...

Zatím to jede asi 6 hodin bez problému. Uvidím po víkendu.

Dám vědět jak to dopadlo...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak aplikace už běží od pátku a naprosto bez problému !

Tak kdyby někdo někdy náhodou řešil podobné chyby tak pozor na chyby z rutiny.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback