PDA

View Full Version : حرفه ای: کار با نخ ها|نمایش نادرست پروگرس بار



mmdsharifi
پنج شنبه 22 خرداد 1393, 18:50 عصر
سلام
من می خواهم اطلاعات یک فایل تکست رو بخونم و هر بار میزان پیشرفتش رو تو پروگرس بار نشون بدم.اما پروگرس بار در 54 درصد متوقف می شه!! و پروسه هم تموم می شه چرا پروگرس بار تا درصد 100 پیش نمی ره؟!

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;


using System.IO;
using System.Threading;


namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

public void ReadFile()
{
StreamReader sr = new StreamReader(@"A:\\1.txt");
FileInfo info = new FileInfo(@"A:\\1.txt");
long size = info.Length;// 449 KB
long current_size = 0;
long incresement = (size / 100);


char[] buff = new char[1000];
while (!sr.EndOfStream)
{
current_size += sr.Read(buff, 0, buff.Length);


if (current_size >= incresement)
{
current_size -= incresement;
Thread.Sleep(100);
progressBar1.Invoke(new updatebar(this.UpdateProgress));
}
}
sr.Close();
MessageBox.Show("Done!");


}
public delegate void updatebar();
private void UpdateProgress()
{
progressBar1.Value ++;
// label1.Text = Convert.ToInt32((label1.Text )=+ 1).ToString() ;
this.Text = progressBar1.Value.ToString();
}


private void Form1_Load(object sender, EventArgs e)
{
StreamWriter sw = new StreamWriter(@"A:\\1.txt");
for (int i = 0; i < 10000; i++)
{
sw.WriteLine("سلام خوبی زمیستبدشیبدیح");
}
sw.Close();
MessageBox.Show("Finish");
}


private void button1_Click(object sender, EventArgs e)
{
ThreadStart theprogress = new ThreadStart(ReadFile);
Thread StartProgress = new Thread(theprogress );


StartProgress.Start();
}
}
}

Mahmoud.Afrad
پنج شنبه 22 خرداد 1393, 20:21 عصر
اطلاعات تا حدی کامل خوانده میشن ولی میزان پیشرفت اشتباه محاسبه میشه. چون داده های فایل شامل کاراکترهای غیر ascii هم میشه و این نوع کاراکترها دو بایت اشغال میکنند. در حالی که تعداد کاراکتر رو با تعداد بایتها مقایسه میکنید و این اشتباه است.

اگر میخوای روی هر خط پردازش داشته باشی باید readLine کنی و بعد درصد رو محاسبه کنی.

اگر در مورد روند کار مورد نظرت توضیح بدی بهتره.

mmdsharifi
پنج شنبه 22 خرداد 1393, 23:52 عصر
در واقع من یک دیکشنری ساختم که کاربر می تونه لغات و معنی هاشو به صورت زیر تو فایل تکست بنویسه و من اونا رو import کنم.

book,کتاب

حالا می خوام موقع خوندن از فایل و یک سری کار ها روی فایل(تشکیل BST) پروگرس بار پر بشه.ممنون می شم با ReadLine واسم توضیح بدین.

Mahmoud.Afrad
جمعه 23 خرداد 1393, 01:33 صبح
اگر حجم از چند مگابایت(حجم کم) تجاوز نمیکنه همه فایل رو یکباره بخون و بعد برای مراحل بعدی از progress استفاده کن.


ولی اگر بری سراغ XML و یا یک دیتابیس پرتابل مثل sqlite بهتره. خودتو درگیر فایل text نکن.

Hadoop
جمعه 23 خرداد 1393, 08:12 صبح
خب اگه دیکشنری داری کل فایل رو بخون و توی دیکشنری بریز

تعداد اعضای دیکشنری رو هم که داری

از اون طریق درصد رو حساب کن

--

من آخرین باری که تکست فایل خوندم و میخواستم توی دیتابیس ایمپورتش کنم ۱۲۵۴۰ خط بود و حدود ۵ مگ ... ولی ایکی ثانیه کلش خونده میشه .. به پروگرس نشون دادن نمیکشه .

--

اگه هر key/value که وارد میکنند رو در یک سطر جدا مینویسند .. باز هم میشه کل فایل رو خوند. تعداد سطرها رو شمرد و از اون راه پروگرس رو فرمولش کرد

--

بجای ترد هم بهتره از Task.Factory.StartNew استفاده کنی. ترد دیگه مرد.

mmdsharifi
جمعه 23 خرداد 1393, 10:45 صبح
اگر حجم از چند مگابایت(حجم کم) تجاوز نمیکنه همه فایل رو یکباره بخون و بعد برای مراحل بعدی از progress استفاده کن.


ولی اگر بری سراغ XML و یا یک دیتابیس پرتابل مثل sqlite بهتره. خودتو درگیر فایل text نکن.

با تشکر از جوابتون :قلب:.
1-من می خوام هردو مرحله رو یعنی: از فایل بخونم و Split کنم و bst.Insert رو انجام بدم.دیروز خودم رفتم سراغ BackgroundWorker (https://www.codeproject.com/Articles/99143/BackgroundWorker-Class-Sample-for-Beginners)که به نظر جالب می اومد.نظرتون در مورد اون چیه؟
2-این پروژه ساختمان داده ست که بایستی با فایل تکست باشه،راستی اگه منبع خوب واسه sqlite دارید ،خوش حال می شم بهم پیشنهاد بدید فقط من با دستورات اولیه SQL اشنایی دارم ولی در مورد sqlite چیز خاصی بلد نیستم.

mmdsharifi
جمعه 23 خرداد 1393, 10:51 صبح
بجای ترد هم بهتره از Task.Factory.StartNew استفاده کنی. ترد دیگه مرد.

با تشکر از جوابی که دادید.
می شه در مورد Task.Factory.StartNew توضیحی بدید؟ و چه جوری تو پروژه م ازش استفاده کنم.