PDA

View Full Version : نمایش اطاعات یک آرایه بزرگ در textbox



SYSMAN
سه شنبه 04 اردیبهشت 1386, 10:10 صبح
فرض کنید حدود 40000 عدد رو از یک فایل خونده و توی یک آرایه قرار داده ایم. حالا می خواهیم تمام این اطلاعات رو به ترتیب توی textbox نمایش بدهیم. وقتی این کار اجرا می شه یک چیزی حدود 2-3 دقیقه طول می کشه (در این مدت برنامه هنگ می کنه). آیا راه حل بهتری وجود داره؟

اَرژنگ
سه شنبه 04 اردیبهشت 1386, 12:30 عصر
فرض کنید حدود 40000 عدد رو از یک فایل خونده و توی یک آرایه قرار داده ایم. حالا می خواهیم تمام این اطلاعات رو به ترتیب توی textbox نمایش بدهیم. وقتی این کار اجرا می شه یک چیزی حدود 2-3 دقیقه طول می کشه (در این مدت برنامه هنگ می کنه). آیا راه حل بهتری وجود داره؟
مثال کدتان را لطفاً ضمیمه کنید.

hdv212
سه شنبه 04 اردیبهشت 1386, 13:36 عصر
برای اینکه در زمان اجرای دستورات بزرگ،برنامه هنگ نکنه، باید از Threading استفاده کنی.

SYSMAN
سه شنبه 04 اردیبهشت 1386, 14:03 عصر
برای اینکه در زمان اجرای دستورات بزرگ،برنامه هنگ نکنه، باید از Threading استفاده کنی.

اینکه مشخص هست. ولی مشکل من به خاطر سرعت نمایش در textbox هست. نه صرفا هنگ برنامه.

hdv212
سه شنبه 04 اردیبهشت 1386, 16:38 عصر
خب میشه مشکلتو واضح تر بگی. خب دستوری که داره اجرا میشه خیلی بزرگه،زمان زیادی هم صرف تمام شدن این Thread میشه. میشه کدی که اطلاعات رو میخونه و در Textbox نشون میده رو اینجا بذاری؟ فکر کنم مشکل از کند بودن خواندن اطلاعاته.

linux
سه شنبه 04 اردیبهشت 1386, 23:04 عصر
فرض کنید حدود 40000 عدد رو از یک فایل خونده و توی یک آرایه قرار داده ایم. حالا می خواهیم تمام این اطلاعات رو به ترتیب توی textbox نمایش بدهیم. وقتی این کار اجرا می شه یک چیزی حدود 2-3 دقیقه طول می کشه (در این مدت برنامه هنگ می کنه). آیا راه حل بهتری وجود داره؟
40000 عدد را چطوری در یک تکتس باکس قرار دادی؟! آیا برای هر عدد یک تکتس باکس اضافه کردی؟ بهترین گزینه استفاده از لیست باکس هست

SYSMAN
چهارشنبه 05 اردیبهشت 1386, 00:58 صبح
توی یک textbox می خواهم اطلاعات رن نمایش بدهم.

این هم نمونه کد:


private void ReadFile(string FileName)
{

try
{
System.IO.TextReader r = System.IO.File.OpenText(FileName);
string[] numbers = r.ReadToEnd().Split(new Char[] {'\n', '\r'},
StringSplitOptions.RemoveEmptyEntries);

foreach (string st in numbers)
txtList.Text += st + "\r\n";

}
catch
{

}

اَرژنگ
چهارشنبه 05 اردیبهشت 1386, 07:54 صبح
برای اینکه در زمان اجرای دستورات بزرگ،برنامه هنگ نکنه، باید از Threading استفاده کنی.

اینکه مشخص هست. ولی مشکل من به خاطر سرعت نمایش در textbox هست. نه صرفا هنگ برنامه.

Threading چکشی نیست که برایه هر میخی استفاده بشه، روشی که استفاده میکنند اشکال داره.
تمامه اعداد را میخواهند از هم جدا کنند بعد نمایش بدن، حتی اگر از تردینگ هم استفاده کنند این مشکل را حل نمیکنه، تا موقعی که تمام اعداد را در آرایه نریخته تمام نمیشه.
به جایه اینکه تمامه تکست فایل را بخوانند باید یکی یکی اعداد را از فایل بگیرند و در تکست نشان بدند (تکست پاکس را آپدیت کنند).

SYSMAN
چهارشنبه 05 اردیبهشت 1386, 19:16 عصر
Threading چکشی نیست که برایه هر میخی استفاده بشه، روشی که استفاده میکنند اشکال داره.
تمامه اعداد را میخواهند از هم جدا کنند بعد نمایش بدن، حتی اگر از تردینگ هم استفاده کنند این مشکل را حل نمیکنه، تا موقعی که تمام اعداد را در آرایه نریخته تمام نمیشه.
به جایه اینکه تمامه تکست فایل را بخوانند باید یکی یکی اعداد را از فایل بگیرند و در تکست نشان بدند (تکست پاکس را آپدیت کنند).

دوست عزیز مشکل ریختن اعداد در آرایه نیست. چون خیلی سریع اینکار انجام می شه، مشکل زمانی ایجاد می شه که این آرایه توی textbox نمایش داده بشه!!

راستی یک نکته خیلی جالب در مورد همین مشکل:
همونطوری که linux (http://www.barnamenevis.org/forum/member.php?u=2818) فرمودند استفاده از لیست باکس کار بهتری هست و یک اختلاف فاحش از نظر نمایش اطلاعات داره به طوری که همون تعداد رکورد توی textbox بعد از 5 دقیقه نمایش داده نشد در یک list box بعد از 8 ثانیه به نمایش در آمد!!!! کسی می دونه علت چی هست؟

ghafoori
چهارشنبه 05 اردیبهشت 1386, 20:50 عصر
همونطوری که linux فرمودند استفاده از لیست باکس کار بهتری هست و یک اختلاف فاحش از نظر نمایش اطلاعات داره به طوری که همون تعداد رکورد توی textbox بعد از 5 دقیقه نمایش داده نشد در یک list box بعد از 8 ثانیه به نمایش در آمد!!!! کسی می دونه علت چی هست؟

nدوست عزیز فکر کنم به این علت این خط از کد شما باشد


txtList.Text += st + "\r\n";

چون شما 40000 بار متن داخل textbox را تغییر می دهید رویدادهای ان باید اجرا شود شما بجای این خط این ابتدا تمام اطلاعاترا در یک رشته بیز بعد به تکس باکس بده

ghafoori
چهارشنبه 05 اردیبهشت 1386, 21:02 عصر
دقیقا به همین خاطر است شما این دو کد را ببنید


Int32 a;
string s="";
for (a = 0; a < 4000; a++) {
textBox1.Text += "\r\n"+ a.ToString();

}



Int32 a;
string s="";
for (a = 0; a < 4000; a++) {
s += "\r\n" + a.ToString();
}
textBox1.Text = s;


اولی 50 ثانیه طول می کشد بعدی در 1 ثانیه

hdv212
چهارشنبه 05 اردیبهشت 1386, 22:19 عصر
منم موافقم .. مشکل همون کدی هست که ghafoori عزیز گفت

linux
پنج شنبه 06 اردیبهشت 1386, 00:12 صبح
دوست عزیز مشکل ریختن اعداد در آرایه نیست. چون خیلی سریع اینکار انجام می شه، مشکل زمانی ایجاد می شه که این آرایه توی textbox نمایش داده بشه!!

راستی یک نکته خیلی جالب در مورد همین مشکل:
همونطوری که linux (http://www.barnamenevis.org/forum/member.php?u=2818) فرمودند استفاده از لیست باکس کار بهتری هست و یک اختلاف فاحش از نظر نمایش اطلاعات داره به طوری که همون تعداد رکورد توی textbox بعد از 5 دقیقه نمایش داده نشد در یک list box بعد از 8 ثانیه به نمایش در آمد!!!! کسی می دونه علت چی هست؟
دلیلش را که دوستان گفتند شما وقتی مقدار تکست یک کنترل را عوض می کنید به همراه آن چندتا رخداد هم پیش می آید که اینها زمان می برند.
من اصلا نمی فهمم برای چی این 40000 عدد را باید در تکست باکس نمایش بدهید؟ هر کدام از کنترل ها برای کارهای خاصی در نظر گرفته شده اند.

SabaSabouhi
پنج شنبه 06 اردیبهشت 1386, 12:58 عصر
با سلام
ظاهراً دیر رسیدم، اما یه نکته:
اگه در یکى از رویه‌هاى برنامه حلقه‌اى طولانى دارید، براى این که سیستم دچار سکته‌ى ناقص (همان هنگ که گفتین) نشود در حلقه فرمان ()DoEvents را قرار دهید تا سیستم به وقفه‌ها رسیدگى کند و حالت هنگ را نبینید.
البته باید توجه داشته باشین که خود این فرمان کمى باعث طولانى‌تر شدن زمان اجرا مى‌شه اما ارزشش رو داره.

صبا صبوحى

SYSMAN
جمعه 07 اردیبهشت 1386, 00:06 صبح
با سلام
ظاهراً دیر رسیدم، اما یه نکته:
اگه در یکى از رویه‌هاى برنامه حلقه‌اى طولانى دارید، براى این که سیستم دچار سکته‌ى ناقص (همان هنگ که گفتین) نشود در حلقه فرمان ()DoEvents را قرار دهید تا سیستم به وقفه‌ها رسیدگى کند و حالت هنگ را نبینید.
البته باید توجه داشته باشین که خود این فرمان کمى باعث طولانى‌تر شدن زمان اجرا مى‌شه اما ارزشش رو داره.

صبا صبوحى

در این حالت استفاده از thread راه حل صحیح تری هست


من اصلا نمی فهمم برای چی این 40000 عدد را باید در تکست باکس نمایش بدهید؟ هر کدام از کنترل ها برای کارهای خاصی در نظر گرفته شده اند.

بایدی نداره. علت اصلی می تونه امکان ویرایش مستقیم توسط کاربر باشه.

linux
جمعه 07 اردیبهشت 1386, 00:40 صبح
در این حالت استفاده از thread راه حل صحیح تری هست



بایدی نداره. علت اصلی می تونه امکان ویرایش مستقیم توسط کاربر باشه.

به نظر می رسه که طراحی اشتباه تو برنامه به این مسیر ختم شده

اَرژنگ
جمعه 07 اردیبهشت 1386, 10:44 صبح
به نظر می رسه که طراحی اشتباه تو برنامه به این مسیر ختم شده

طراحی؟؟ چه نوع طراحی به اینجا خطم میشه؟
احتمالاB مشکل چیزه دیگری است. وگرنه هیچ کسی با ۴۰۰۰۰ تا چیز هیچ وقت یکجا کار نمیکنه.(اگر میکنه مثال بفرستید! :))
شاید این برایه تمرین کاره دیگریست.

SYSMAN
شنبه 08 اردیبهشت 1386, 22:03 عصر
به نظر می رسه که طراحی اشتباه تو برنامه به این مسیر ختم شده

دوست عزیز طراحی اشتباه نبوده



شاید این برایه تمرین کاره دیگریست.

دقیقا

Sorenaa_s
دوشنبه 10 اردیبهشت 1386, 17:04 عصر
1. زمانیکه از Threading استفاده میشه، اگر در Thread جدید، با UI کای انجام بشه ( مثلا همین نوشتن متن ر TextBox ) به شدت UI رفتارهای عجیب و غریب از خودش نشون میده ( مثلا همین پایین بودن سرعت و یا هنگ کردن ) در این موارد بهتره که از Form.Invok برای کار با UI استفاده بشه.

2. concatenate کردن string به شدت کند صورت می گیره، و روی Memory تاثیر بدی داره، بهتره از StringBuilder استفاده بشه. این کار به شدت سرعت اجرای کد رو بالا میبره ( رو همین مثال میشه تست کرد )

3. به نظر من هم بهترین راه استفاده از ListBox هست. البته به این صورت که از آرایه ای که از Split بدست آمده ArrayList ساخته بشه و به ListBox.DataSource اختصاص داده بشه.