Aceminin C# .Net Soruları

Başlatan yldzelektronik, 06 Kasım 2013, 13:09:58

yldzelektronik

Selamlar.

C# .net (vs 2010 üzerinde) ile terminal benzeri bir uygulama yaptım.

Seri porttan 6 paket veri geliyor ve bunu datagridwiev ile görüntülüyorum.Data sürekli geldiğinden datagridview de sürekli büyüyor.

Ben bu programı sensör ölçümlerini test etmek için log etmesi için yazdım. Data sürekli geliyor ve datagridde sürekli datayı güncelleyip gösterebiliyorum sorun yok.

Ancak datagrid büyüdükçe programın ramde işgal ettiği alan da şişiyor. Bu program yaklaşık bir hafta çalışmak ve log almak zorunda.

Bu tip uygulama geliştirirken bu duruma nasıl çözüm bulunuyor?

Ram şişmesini nasıl aşabilirim? Ayrıca bu konuyu ne diye aramalıyım?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

barisertekin

Yazdığınız kodu görmeden zor ama oluşturduğunuz nesneleri ram'den silme konusuna bakabilirsiniz.
Özellikle bir döngü içinde sürekli nesne oluşturuyorsanız bu işlemi yapmalısınız.

Bellek Yönetimi ve Garbage Collector
http://www.csharpnedir.com/articles/read/?id=1034

yldzelektronik

C# ı daha yeni öğrenmeye çalışıyorum. O yüzden çok ama çok acemi birinin yazdığı bir program.

Hataları ve yazım şeklini de eleştirmenizi rica ediyorum.

Uygulama aşağıda. Hem daha düzgün program yazmak ile ilgili hem de ram şişmesi ile ilgili duruma dair önerilerinizi bekliyorum.

http://www.dosya.tc/server18/2OqXIx/Ultras_nikSensorTestUygulamas_.zip.html
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

Kabil ATICI

fonksiyon
public void kaydet(string kay_metin)
        {
            string path;
            string tarih;

           
                tarih = DateTime.Now.ToShortDateString(); //tarihi sistemden al
                path = AppDomain.CurrentDomain.BaseDirectory;//uygulamanın yolunu al
                StreamWriter yaz = File.AppendText(path + "Olcum" + tarih + ".txt");
                yaz.WriteLine(kay_metin);
                yaz.Close();
           
        }

burada sabit diske txt formatında kaydeder. programın bulunduğu klasör içine olcum+tarih.txt adında bir dosyaya kaydeder.
Yani dosya günlük olarak kaydedilir.

buda yazma işinin yapmasını sağlar
kaydet(sicak.ToString());

ram üzerine fazla bilgi toplamak biraz sıkıntılı olabilir.
Onun için verilerinizi sabit diske kaydedir. Anlık olarak göreceğim derseniz programınızda bunu zaten yapıyorsunuz. Ama yinede sınırlı miktarda görüntüleme yapmanız daha iyi olur.

Yukarıdaki kod verilerinizi sabit diskte bir txt dosyasına kaydetme imkanı verir. Çeşitli programlarla bu dosyadan verilerinizi okuyabilirsiniz.
ambar7

yldzelektronik

@Ambar7

Sizin dediğiniz yönteme binaen aklıma terminalin yaptığını yapmak geldi.Belirli sayıda veri alsın sonra silinsin.Silinmeden evvel yeni kayıda eklensin.Böylesi daha güzel gibi.

Kayıt yapmadan denedim.

100 veri ile program maks. 17,758 kb a kadar gidiyor. 100 olduğunda text box ve datagrid sıfırlanıyor. Veri almaya devam ederken 14,xx kb lara düşüyor üçüncü kez denemedim ama ikinci yüzü de bitirdiğinde program yaklaşık 15,xxx kb larda kalıyor. Sanırım daha uzun çalışsa da öyle kalacak.
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Şimdi bu verileri excele aktarmak istiyorum.Nette bir sürü örnek var ama biraz kafamı karıştırdı. İki for döngüsü içinde önce sütun sonra satırı aktarmış.En uygun yöntem bu mudur?

private void btnExcelAktar_Click(object sender, EventArgs e)

{

Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();

excel.Visible = true; //Daha fazla bilgi için : [url=http://www.gorselprogramlama.com]www.gorselprogramlama.com[/url]

Microsoft.Office.Interop.Excel.Workbook workbook = excel.Workbooks.Add(System.Reflection.Missing.Value);

Microsoft.Office.Interop.Excel.Worksheet sheet1 = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Sheets[1];

int StartCol = 1;

int StartRow = 1; //Daha fazla bilgi için : [url=http://www.gorselprogramlama.com]www.gorselprogramlama.com[/url]

for (int j = 0; j < dataGridView1.Columns.Count; j++)

{

Microsoft.Office.Interop.Excel.Range myRange = (Microsoft.Office.Interop.Excel.Range)sheet1.Cells[StartRow, StartCol + j];

myRange.Value2 = dataGridView1.Columns[j].HeaderText;

}

StartRow++;

for (int i = 0; i < dataGridView1.Rows.Count; i++)

{

for (int j = 0; j < dataGridView1.Columns.Count; j++)

{ //Daha fazla bilgi için : [url=http://www.gorselprogramlama.com]www.gorselprogramlama.com[/url]

try

{

Microsoft.Office.Interop.Excel.Range myRange = (Microsoft.Office.Interop.Excel.Range)sheet1.Cells[StartRow + i, StartCol + j];

myRange.Value2 = dataGridView1[j, i].Value == null ? "" : dataGridView1[j, i].Value;

}

catch

{

;

}

} //Daha fazla bilgi için : [url=http://www.gorselprogramlama.com]www.gorselprogramlama.com[/url]

}

}


Ayrıca ben excele aktarma işini her veri geldiğinde gerçekleştirmek istiyorum.Yani log butonuna tıklandığında datagridde güncellenen veri aynı şekilde excelde de güncellenmeli.Topluca değilde anlık olmalı yani.

Çok mu karıştırdım bilmiyorum ama mesele bu şekilde. Nasıl yapabilirim?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

yldzelektronik

#5
Bir yerde takıldım.

Analog ölçümlerin ham değerlerini alıyorum ve bunu pcde voltaja çeviriyorum. Virgülden sonra 4 5 sayı falan oluyor. Bunu excele aktardığımda ise sayı sanki milyonmuş gibi algılıyor.Şöyle;

Voltaja çevirdiğimde 4015.4587 gibi değerler alıyorum.Bunu excele aktardığımda excelde 401.454.587 olarak gösteriyor. Yani sayıya bütünmüş gibi davranıyor.Bunu nasıl çözebilirim?

Ayrıca ben virgülden sonra 3 haneye kadar görmek istiyorum.Sayıları c#da float tanımladım.Virgül hassasiyetini belirleyebilir miyim?

Edit: Düzelttim.Artık bütün değerleri float olarak excelde de görüntüleyebiliyorum. (float)Convert.ToDouble() ile textbox.text değerini çeviriyorum, sonra datagride oradan excele.

Şimdi excele aldığımda sütunların otomatik olarak fill olmasını istiyorum.Ama bir yol bulamadım bunun için.Sağda solda yazanları denedim olmadı.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

0xefe

Nacizene bir önerim olacak. "Sensör ölçümlerini test etmek için" demişsiniz. Geçici bir durum için kayıt yapıyorsanız yazacaklarım işinize yaramaz, kısa vadede size zaman kaybettirebilir ama ölçümleriniz sürekli loglanacaksa uzaktan takip, analiz gibi birşeyler düşünüyorsanız ileride çok işinize yarayacaktır. Verilerinizi excel belgesinde değil de bir veritabanında tutun. (MSSQL- Mysql gibi) Nette C# için hazır örnekler vardır mutlaka.
Böylece
- verileriniz derli toplu, daha güvende olur.
- ileride kaydettiğiniz verileri bir web sayfası yada akıllı telefon uygulamasında göstermek istediğinizde kolayca veritabanından veri çekebilirsiniz.
İsterseniz veritabanından excel, csv formatında çıktı hazırlayabilirsiniz.

İyi çalışmalar.

muhittin_kaplan

dataset teki verileri (grid e atıyormussunuz dataset yada table dadır) hemen grid e atmam gerek yok,  eğer anlık görmek istiyorsam bir text box a yazarım. textbox a yazmakla grid e yazmak hem hız hemde sistem kaynakları açısından oldukça farklılık gösterir.
peki ne yapardım ?
Anlık Alır Text de gösterir ve dataset yada table a kaydederdim.
belirli bir sayıya geldiğinde, dosya adı vererek dataset yada table in writexml komutuyla xml dosya biçimi olarak yazardım.

eğer uzaktan erişim vb durumlar isteniyorsa veritabanına kayıt hepsinden mantıklıdır. (bir üstteki mesaj)

yldzelektronik

Alıntı yapılan: 0xefe - 06 Kasım 2013, 22:06:28
Nacizene bir önerim olacak. "Sensör ölçümlerini test etmek için" demişsiniz. Geçici bir durum için kayıt yapıyorsanız yazacaklarım işinize yaramaz, kısa vadede size zaman kaybettirebilir ama ölçümleriniz sürekli loglanacaksa uzaktan takip, analiz gibi birşeyler düşünüyorsanız ileride çok işinize yarayacaktır. Verilerinizi excel belgesinde değil de bir veritabanında tutun. (MSSQL- Mysql gibi) Nette C# için hazır örnekler vardır mutlaka.
Böylece
- verileriniz derli toplu, daha güvende olur.
- ileride kaydettiğiniz verileri bir web sayfası yada akıllı telefon uygulamasında göstermek istediğinizde kolayca veritabanından veri çekebilirsiniz.
İsterseniz veritabanından excel, csv formatında çıktı hazırlayabilirsiniz.

İyi çalışmalar.

Öncelikle öneriler için teşekkürler.

Muhtemelen gideceği nokta orası.Ancak şuan için en hızlı sonuca gidecek şekilde işi bitirmem gerekli.Sanırım şuan veri tabanı işini sonraya bırakacağım.

Alıntı yapılan: muhittin_kaplan - 07 Kasım 2013, 08:46:07
dataset teki verileri (grid e atıyormussunuz dataset yada table dadır) hemen grid e atmam gerek yok,  eğer anlık görmek istiyorsam bir text box a yazarım. textbox a yazmakla grid e yazmak hem hız hemde sistem kaynakları açısından oldukça farklılık gösterir.
peki ne yapardım ?
Anlık Alır Text de gösterir ve dataset yada table a kaydederdim.
belirli bir sayıya geldiğinde, dosya adı vererek dataset yada table in writexml komutuyla xml dosya biçimi olarak yazardım.

eğer uzaktan erişim vb durumlar isteniyorsa veritabanına kayıt hepsinden mantıklıdır. (bir üstteki mesaj)

Abi hepsini ayrı ayrı text boxo almış durumdayım.Gelen verileri tekrar düzenleyip datagride alıyorum.Gerekli değildir muhtemel ama ben biraz görsel dursun istedim.Böyle hoş gözüküyor.Ayrıca veriler daha düzenli gözüküyor.

An itibariyle data griddeki satır sayısı 100e ulaştığında excele çekip data grid ve textboxı temizliyorum ki bu da güzellik sağlıyor.

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

An itibariyle yaşadığım sorun ise aşağıda yapmak istediğimi gerçekleştirmemiş olmam;
Star log butonuna bastığımda savefile dialog nesnesiyle dosyayı kaydedeceğim yer için pencere açılsın.Savefiledialog ile seçtiğim yere xlsx formatında kaydetsin. Datagrid 100 olunca excele aktarsın.Save etsin.Stop log dediğimde de tekrar kaydedip dosyayı açsın.

Şimdi stop loga bastığımda tekrar kaydedip dosyayı görüntüleme işini yaparım.Savefile dialog nesnesini kullanmayı az buçuk öğrendim ve dosya uzantısı için iki farklı format belirleyebiliyorum. Ama bunları excel ille birleştirmedim.

            if (Log == false)
            {
                SaveFile.Title = "Lütfen kaydetmek istediğiniz yeri seçiniz";
                SaveFile.Filter = "(*.xls)|*.xls|(*.xlsx)|*.xlsx|Tüm dosyalar(*.*)|*.*";
                SaveFile.FilterIndex = 2;
                SaveFile.ShowDialog();
                ExcelKitap.SaveAs(SaveFile.FileName + ".xlsx", Excel.XlFileFormat.xlWorkbookNormal, Missing, Missing, false, Missing, Excel.XlSaveAsAccessMode.xlNoChange);
                Path = SaveFile.FileName;
                Excell = new Excel.Application();
                ExcelKitap = Excell.Workbooks.Add(Missing);
                ExcelWorkSheet = (Excel.Worksheet)ExcelKitap.Worksheets.get_Item(1);
                ExcelRange = ExcelWorkSheet.UsedRange;
                ExcelWorkSheet = (Excel.Worksheet)Excell.ActiveSheet;
                Log = true;
                bStartLog.Text = "Stop Log";
            }
            else
            {
                Excell.Visible = true;   //Ugulama kullanıcıya gösteriyor.
                bStartLog.Text = "Start Log";
                Log = false;
            }


Tek sorunum şimdilik bu.

Önerileriniz nelerdir?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

yldzelektronik

ExcelKitap.SaveAs(SaveFile.FileName + ".xlsx", Excel.XlFileFormat.xlWorkbookNormal, Missing, Missing, false, Missing, Excel.XlSaveAsAccessMode.xlNoChange);


Bu satırda birşeyler var.Dosyayı kaydediyor ve oluşturuyor.Ancak dosyayı açtığımda excel dosya uzantısı ile ilgili hata veriyor. Ofis 2010 yüklü.Nerede hata yapıyorum?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

yldzelektronik

Daha önce hiç kimse c# ile excele veri aktaracak bir program yazmadı mı?Veya bu kadar çok önemli bir ticari sır mı?Yada çok mu basit bir soru?Biri bu konuda açıklayıcı bir yorum yapamaz mı?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

mufitsozen

Alıntı yapılan: yldzelektronik - 07 Kasım 2013, 14:15:39
Daha önce hiç kimse c# ile excele veri aktaracak bir program yazmadı mı?Veya bu kadar çok önemli bir ticari sır mı?Yada çok mu basit bir soru?Biri bu konuda açıklayıcı bir yorum yapamaz mı?

Ben yapiyorum!

Bence evet cok basit bir soru. WebBrowser controlu kullanilarak yapilabilir (baska yollarida var ama gereksiz, en kolay ve en powerful cozum bence bu)

bkz:http://www.codeproject.com/Articles/15760/How-to-Integrate-Excel-in-a-Windows-Form-Applicati

Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

yldzelektronik

Selamar

zedgraph isimli grafik kütüphanesini kullanan var mı?

Bu kütüphane ile multi y axis oluşturma kısmını anlayamadım.Birden fazla y ekseni oluşturmayı nasıl yapabilirim?Yardımcı olabilecek var mı?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

atillaa

zedgraph kütüphanesini kullandım ancak her grafikte tek veri çizdirdim, birden fazla verinin grafiğini çizdirmede nasıl bir sorun yaşıyorsunuz ?

yldzelektronik

http://zedgraph.sourceforge.net/linesamples.html

Adresindeki ilk resimde yer alan grafiği çizmeye çabalıyorum.Birden fazla sayıda y ekseni çizdirmem gerekli.Ancak bunu nasıl yapabilirim bilmiyorum.

Y2Axis isimli bir kod grubu var (event mı class mı bilmiyorum.C# ı yeni öğrenmeye başladım.Öğrenmeye çalışmaya başladım desem doğru olur) bunu kullanabilirim gibi geldi ama çizdiremedim.Kullanımına ait örnek de bulamadım.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.