ContextSwitchDeadlock was detected durumu

22 Ağu 2009 In: .net, ipucu
Eger Visual Studio ile debug yaparken aşagı daki hatayı alıyorsanız :

ContextSwitchDeadlock was detected
" CLR, 60 saniye içinde 0x46fae0 COM içeriğinden 0x46fc50 COM içeriğine geçemedi. Hedef içeriğe/gruba sahip olan iş parçacığı büyük olasılıkla pompalamayan bekleme yapıyor veya Windows iletileri pompalamadan çok uzun süreyle çalışan bir işlemi işliyor. Bu durum performansı genellikle kötü etkiler ve uygulamanın yanıt vermemesine veya bellek kullanımının zaman içinde sürekli artmasına neden olabilir. Bu sorunu önlemek için, tüm tek iş parçacıklı (STA) grup iş parçacıklarının bekleme komutları (örn. CoWaitForMultipleHandles) pompalaması ve uzun süre çalışan işlemler sırasında da düzenli olarak ileti pompalaması gerekir. "

Çözüm oldukca basit tek yapmanız gereken :

Debug -> Exceptions -> Managed Debug Assistants

altındaki ContextSwitchDeadlock check ini kaldırmak. CLR den kaynaklanan bu durum Release aşamasında tabii ki oluşmuyor.

Merhabalar, geçenlerde satın aldıgımız masaüstü RFID okuyucu ve yazıcısını hastane yazılımında SDK sını kullanmak istedigimizde, SDK içindeki API nin DLL inin C ile yazıldıgını fark ettik. Ve Visual Studio ya normal DLL i ekler gibi ekleyemedik.

Bende paylaşmak istedim, bu tarz başka dillerle yazılmış DLL leri P/Invoke ile kullanıyoruz projelerimizde. Bu tarz Win32 DLL lerini P/Invoke ile çagırabiliriz.

Bizim kullandıgımız masa üstü RFID okuyucusunun modeli TKP705 idi. Ama içerisinde bir Serial Reader var.  Windows cihazı HJSRFID-7640 ve HJSRFID-S7640 olarak tanımakta. Seri çevirici üzerinden USB RFID cihazı ile haberleşiliyor.

SDK içerisinden çıkan CVAPIV01.DLL C dili ile yazılmış. .Net projenizde kullanmak için DLL ile Bin klasorunun altına kopyalayıp.

        [DllImport("CVAPIV01.dll", CharSet = CharSet.Ansi)]

Deyip altınada kullanmak istedigimiz methodları tanımlıyoruz tek tek,

 

        public static extern int GetVersionAPI(StringBuilder VersionAPI);
        public static extern int OpenComm(StringBuilder Com, int Baudrate); 
...

Burada dikkat etmeniz gereken Win32 type lerini C# nasıl tanımlayacagınızı bilmeniz. Ve API içinde methodları parametreleri ile bilmeniz.Yukarıdaki 2 method için API nin SDK dökümanınında ( S795X-RS232 ) 

Şu şekilde ifade edilmişti :

int GetVersionAPI( char *VersionAPI )
int OpenComm(char *Com, int Baudrate)


kritik nokta türler, işte türlerin  listesi


Win32 Types Specification CLR Type
char, INT8, SBYTE, CHAR* 8-bit signed integer System.SByte
short, short int, INT16, SHORT 16-bit signed integer System.Int16
int, long, long int, INT32, LONG32, BOOL* , INT 32-bit signed integer System.Int32
__int64, INT64, LONGLONG 64-bit signed integer System.Int64
unsigned char, UINT8, UCHAR* , BYTE 8-bit unsigned integer System.Byte
unsigned short, UINT16, USHORT, WORD, ATOM, WCHAR* , __wchar_t 16-bit unsigned integer System.UInt16
unsigned, unsigned int, UINT32, ULONG32, DWORD32, ULONG, DWORD, UINT 32-bit unsigned integer System.UInt32
unsigned __int64, UINT64, DWORDLONG, ULONGLONG 64-bit unsigned integer System.UInt64
float, FLOAT Single-precision floating point System.Single
double, long double, DOUBLE Double-precision floating point System.Double
 

 

 

RFID Bileklikler

20 Tem 2009 In: .net

Şu sıralarda sürekli kulak aşinası oldugumuz temazsız kartlar işte bu teknoloji ile çalışmakta. Aslında uzun zamandır hayatımızda bu teknoloji,  PDKS sistemlerinde de sürekli yaka kartı veya otoparklarda kullanılmakta idi. Hastanemizde yatan hastaların medikal işlemlerini takip etmek amacıyla satın aldıgımız cihazlar üzerinde RFID aparatı bulunmakta. O yüzden yaptıgımız çalışmayı özetlemek istiyorum.

Radyo Frekansı ile Tanımlama (RFID) teknolojisi, radyo frekansı kullanarak nesneleri tekil ve otomatik olarak tanıma yöntemidir (bkz Otomatik Tanıma ve Veri Toplama). RFID, temel olarak bir etiket ve okuyucudan meydana gelir. RFID etiketleri yerleştirilen nesne ile ilgili bilgilerini almak, saklamak ve göndermek için programlanabilirler. Nesne üzerine yerleştirilen etiketlerin okuyucu tarafından okunmasıyla tedarik zinciri yönetimi veya HBYS g,b, otomasyon sistemlerine bilgileri otomatik olarak kaydedilebilir veya değiştirilebilir.

RFID etiketi, radyo frekansı ile yapılan sorguları almaya ve cevaplamaya olanak tanıyan bir silikon yonga, anten ve kaplamadan meydana gelir. Yonga, etiketin üzerinde bulunduğu nesne ile ilgili bilgileri saklar. Anten, radyo frekansı kullanarak nesne bilgilerini okuyucuya iletir. Kaplama ise etiketin bir nesne üzerine yerleştirilebilmesi için yonga ve anteni çevreler. Pasif olanları hiç bir enerji kaynagı barındırmazlar, okuyucunun gücüyle çalışırlar.

RFID, düşük frekans (LF) 125–134 kHz, yüksek frekans (HF) 13.56 MHz, ultra yüksek frekans (UHF) 860–960 MHz, 2.45 GHz ve süper yüksek frekans (SHF) 5.8 GHz frekanslarında kullanılabilmektedir.

Bizdeki çözüm 2 şekilde mümkündü : 

1- Tek kullanımlık RFID etiketli ürünler aşagıdaki gibi 

 
2 - Çok kullanımlık sterilazasyon işleminden geçebilen şu bileklikler


Bu tarz pasif RFID tagları 3-5 cm mesafeden okuma yapabilmektedir.

Cihazımız Intel® Mobile Clinical Assistant (MCA) platformunda oldugu için HealthCare donanım ve SDK larını ile uygulamamızı geliştirdik.

Visual Studio ile yaptıgımız projeye "Add Reference" ile "Intel.Healthcare.dll" projeye eklenmesi ve MCA nın SDKsı kurulu olması gerekiyor. Development yapılan makinada ve MCA cihazda ayrı ayrı kurulması gerekiyor. Ben 2.0.0.25057" versiyonunu kullanıyorum.
 
.Net platformunda C# ile RFID, barkod ve kamera üzerinden verileri ala bilmekteyiz. 

RFID tagları okumak için :

RfidReader RFokuyucu= new RfidReader();
ASCIIEncodingencode = new ASCIIEncoding();
RfidTagokunanTAG = null;
Buttonsbtn;
EventHandler<RfidEventArgs>RfidEtiketOkundu = null;

 

Okuma işlemi gerçekleştiginde aşagıdaki event tetiklenir ve

        public void RfidEtiketOkundu (objectsender, RfidEventArgs args)
                {
                    try
                    {
                        //Okundu
                        txt_or_protokolno.Text= encode.GetString(args.RfidReader.RfidTags[0].Data).Trim(); //RFID etiketin içindeki bilgi yi alıyoruz
                        txt_or_protokolno.Text =txt_or_protokolno.Text.Trim(); //Array oldugu için ihtiyacımız olmadıgı alanlara 0x20 yazmıştık onlardan kurtuluyoruz
                        getir(); //gerekli işlemler veritabanından getirilir
                        args.RfidReader.ReleaseDevice(); //Cihazı okuma modundan çıkartıyoruz, sonraki okumalar için hazır
                    }
                    catch(Exception ex)
                    {
                        MessageBox.Show(ex.Message,"Hata", MessageBoxButtons.OK,MessageBoxIcon.Error);
                    }

                } 

 

 

ETA muhasebe programında her şirket için SQL server da ETA_FIRMAISMI_2009 gibi açılmakta. Eger ETA ya entegrasyon yapmak istiyorsanız. Cari kartlarla ilgili CARKART tablosundaki CARKOD alanı carilerin kodunu, CARHAR ve CARFIS ilede cari hareketlerin dökümünü alabilirsiniz.

SELECT CARKART.CARKOD, CARKART.CARUNVAN, CARHAR.CARHARTAR, CARHAR.CARHARREFNO, CARHAR.CARHARTIPI, CARHAR.CARHARCARKOD,CARHAR.CARHARTUTAR
FROM CARHAR INNERJOIN CARKART ON CARHAR.CARHARCARKOD= CARKART.CARKOD
WHERE CARKART.CARKOD='DNM003'


gibi hareket ekstresi alınabilir.

Muhasebe hesaplarındaki (120,157,100 gibi) hareketleri ( mahsup , tahsilat ve tediye fişi gibi) hareketleri görüntülemek için :

SELECT     MUHFIS.MUHFISNO, MUHFIS.MUHFISTAR, MUHFIS.MUHFISCINSI, MUHHAR.MUHHARSIRANO, MUHHAR.MUHHARMUHKOD, MUHHAR.MUHHARACIKLAMA,

                      MUHHAR.MUHHARBATIPI, MUHHAR.MUHHARTUTAR,MUHFISTIP.MUHFTKOD

FROM         MUHHAR INNERJOIN

                      MUHFIS ON MUHHAR.MUHHARREFNO= MUHFIS.MUHFISREFNOINNER JOIN

                      MUHFISTIP ON MUHFIS.MUHFISCINSI= MUHFISTIP.MUHFTNO


Aktarım yapmak için ilk olarak hareketin MUHFIS tablosuna insert edilecek daha sonrada aşagıda fonksiyonla MUHHAR a kaydedilecek


        
public static boolETAyaDTYEkle(DateTime ftar, int muhrefno, intsira, string muhhod, stringaciklama, int batipi,decimaltutar, string muhharno)

        {
            try
            {
                baglans();
                SqlCommand selcom = new SqlCommand(@"InsertInto MUHHAR
(MUHHARTAR,MUHHARREFNO,MUHHARSIRANO,MUHHARMUHKOD,MUHHARACIKLAMA, MUHHARBATIPI,MUHHARTUTAR,MUHHARNO,MUHHARCINSI,MUHHARKAYITONC, MUHHARKAYNAK,MUHHARMATATEFLAG )

VALUES

(@mft,@mfrn,@mfsn,@muhhd,@mhacik,@mhbatipi,@mhtutar,@mhno,1,4,4,1)", conns);

                selcom.Parameters.Add("mft", SqlDbType.DateTime).Value= ftar;//fistarihi

                selcom.Parameters.Add("mfrn", SqlDbType.NVarChar).Value= muhrefno;//fiş nosu MA-0001

                selcom.Parameters.Add("mfsn", SqlDbType.Int).Value= sira;//otomatik artacak

                selcom.Parameters.Add("muhhd", SqlDbType.NVarChar).Value= muhhod;//borc toplam

                selcom.Parameters.Add("mhacik", SqlDbType.NVarChar).Value= aciklama;//alacak toplam

                selcom.Parameters.Add("mhbatipi", SqlDbType.Int).Value= batipi;

                    selcom.Parameters.Add("mhtutar", SqlDbType.Decimal).Value= tutar;

                        selcom.Parameters.Add("mhno", SqlDbType.NVarChar).Value= muhharno;

                selcom.ExecuteNonQuery();
                conns.Close();
                selcom.Dispose();
                returntrue;
            }
            catch(Exception ex)
            {
                Cursor.Current= Cursors.Default;
                MessageBox.Show(ex.Message);
                return false;
            }
        }

XtraGrid üzerine bir DataSoruce Bind ettiniz ve kullanıcı MultiSelect özelligi ile grid üzerinde işlem yapmak istedigi satırları seçti, 
Normalde gridView1.GetSelectedRows() size seçili olan satırların Row Handles larını veriyor. Ama gruplanmış verilerde bazı negatif degerlerle ugraşmanız gerekmekte.

Onun yerine aşagıdaki method size parametre olarak gönderdigini GridView in içinde seçili olan satırları aynen bind ettiginiz verileri ile DataTable olarak bütün kolonları ile getirmekte.


        private DataTable SecilenlerinListesi2(DevExpress.XtraGrid.Views.Grid.GridView view)
        {
            DataTable sonucTb = new DataTable();
            if(view.DataSource is DataView)
            {
                DataTable kaynakTb = ((DataView)view.DataSource).Table;
                sonucTb = kaynakTb.Clone();
                foreach(int rowHandle in view.GetSelectedRows())
                {
                    DataRowrow = view.GetDataRow(rowHandle);
                    sonucTb.Rows.Add(row.ItemArray);
                }
                sonucTb.AcceptChanges();
            }
            return sonucTb;
        }

GM862 ile Telemetri

15 Tem 2009 In: .net, .Net Micro Framework

Nihayet elime bugün ulaştı cihaz. Biliyorsunuz Telit GM862, bir SIM kartı ile size GPS, GSM ve GPRS gibi nimetlerden faydalanma ımkanı sağlıyor. Lakin bir sorundan bahsetmek istiyorum size, GM862'nin giriş ve çıkış pinleri erkek bir molex konnektörle saglanıyor. Cüzi bir ücret karşılıgı Molexin karşı konnektörünü temin etmek mümkün ama bu işinize yaramayacaktır, bunun için bir PCB board imal etmelisiniz. Gaziantep'de nasıl temin etmek mümkün bilmedigim için (maliyetide yüksek olacagının tahmin ettigim) kartı biraz araştırınca şu alternatifleri buldum:

 

 
 

 
Birisi SparkFun a ait $29 digeri ise MikroElektronika $24. Bu kartları kullanarak Seri baglantı kurmak mümkün ama voltaj ve TTL level sorunu yaşamamak içten bile degil. Birde bunun için devre hazırlamak gerekecek.

Bu alternatiflerin dışında GM862 için hazır RS232 çıkışlı interface kartlarda mevcut, mesela SparkFan a ait bu kart gibi 
 
 
Bu cihazla tek yapmanız gereken GM862 modülünü MOLEX konnektörüne yerleştirmek ve 9 V elektrikle beslemek. Seri port üzerinden haberleşmeye hazır. Lakin benim kullandıgım interface biraz farklı. Ben şimdi ilk olarak C# ile bir kaç uygulama geliştirip daha sonrada .Net Micro Framework için bir uyarlayıp TahoeII üzerinde koşturmak istiyorum.

Bu sayede sahadan veya otomasyondan verileri toplayıp GPRS üzerinden veya SMS ile sunucuya bildirecek bir uygulamalar geliştirmeyi planlıyoruz. İşte benim modül ve interface
 
 
 


Gelişmelerden sizide haberdar etcem tabii ki.

WH EMP 800 serisi SDK sorunu

23 Haz 2009 In: .net

Merhabalar, hastanemizdeki kioskların bozuk para ile çalışması için wh münzprüfer berlin gmbh firmasına ait EMP 800.14 v6 serisi elektronik bozuk para seçicilerinden  ( electronic coin selector ) satın aldık. Bu cihaz direk USB ye baglanmakta ve içini attıgınız metal paranın 32 farklı türden hangisi oldugunu söylemekte. Bu paraları siz cihaza ögrete bildiginiz gibi, tanımlı paralardan da kullana bilyorsunuz Bizim ki TRY için özelleştirilmişti zaten.



Cihazın kutusunda hiç bir driver ve developer tool gelmemekte. Biz biraz ugraştan sonra .Net SDK sını ve WHDL driverlarını temin edebildik. Biraz ilginç bir durum.

Cihazı USB üzerinden takıp tanıttıktan sonra, CCTalk üzerinden haberleşilebiliyor. Biz ilk .Net 2.0 ile Visual Studio 2005 projesi olan EXE derledik ve USB üzerindeki cihazı bir türlü bulamadı. Sorunun external power ile beslemedigimiz için oluştugunu düşünüyorduk. Ama sorunu SDK yı oluşturan DLL ve EXE projelerini Visual Studio 2008 üzerinde tek solution altında toplayıp DLL üzerinde debug modunda derledigimiz de fark edebildik. USBCoinSelectorLib.dll in windows üzerindeki COM portlarını alıp, hanginin COIN ACCEPTOR oldugu tesbit ettigi if koşulunda Türkçe işletim sisteminden kaynaklanan şöyle bir sorun vardı : 

srchcomm.Category propertysi "coin acceptor" gelmekte, bunu .ToUpper() methodu ile büyük harfe çevirince "COİN ACCEPTOR" olmakta ve if koşulundaki =="COIN ACCEPTOR" koşulundan geçmemekte ve bir türlü USB cihazı bulamamakta idi.

Bu koşulu düzeltince DLL sorunsuz çalışmaya başladı ve bizde kioks üzerinde koşan projemize import edebildik. Burada paylaşmak istedik bu sorunla saç baş yolmayın diye :)

 

Cihaz yeni ve eski bütün metal bozuk paraları tanımakta. Yenileri TL, eskileri TY olarak tanımakta. (kuruşlardada sorun yok).

Mobile Clinical Assistant (MCA)

18 Haz 2009 In: .net, tam-med

Merhabalar, uzun zamandır hastanemiz için bekledigimiz MCA lar geldi. Cihazlar Motion Computing firmasına ait C5 modeli. Cihazlar medikal sektöre yönelik. Cihazın amacı yatan hastalar için dolaşan kağıt ve kalem olaylarını ortadan kaldırmak. Her hastaya RFID bileklik verilecek. Bu bileklikler içinde hastaya ait kimlik ve bazı klinik bilgiler yazılacak.


   

 


Doktor veya hemsire hastanın odasına Motion C5 ile girdiginde hastanın orderı (Hizmet, ilaç ve sarfları), kısacası hasta ile ilgili bütün bilgilere erişe bilecek. Uygulamayı .Net platformunda C# ile yapıyoruz. Intel in bu cihazlar için ürettirgi bir HealthCare adında SDK'sı var. Şimdi onun üzerinde RFID bileklikle ilgili örnek çalışmalar yapıyorum. C5 üzerinde 2D ve 3D okuya bilen birde barkod oluyucusu var. Tabii ki entegre kamerasıda mevcut.

802.11b/g Wireless adaptorü ve bluetooth da unutulmamış. Anti-bakteriyel kaplaması ile hem hijyenik açıdam hemde IP54 standartında su ve toz a karşıda dayanıklı.

Agırlıgıda fena degil. Elde iken kalemsiz kullanılmıyor, ama deck ünitesi sayesinde standart bir masaüstüne dönüşüyor.

Örnek uygulama ile ilgili ekran görüntüsü aşagıda:

 


Zamanla paylaşmaya devam edecegim.

 

 
 

Ben Kimim ?

Celiker BahceciMerhabalar, ben Çeliker BAHÇECİ. 2004 den beri özel sektörde bilgisayar mühendisligi ve egitmenlik yapıyorum. Yine aynı yılın Ekim ayından beri sitemde .Net ile programlama ve hayat görüşüm ile ilgili makalelerimi yayınlıyorum. Blogum dışında Yazgelistir.com, mobilnedir.com gibi ineta kapsamındaki bir çok siteye Microsoft teknolojileri ile ilgili yazılar yazmaktayım.
Bu site ile sizinde hayatınızı anlamlandırmanızda bir parça katkımın olması dilegiyle...


Arşiv