PDA

View Full Version : هنگ برنامه در مقادیر بالا



sara_aryanfar
پنج شنبه 14 مهر 1390, 19:40 عصر
با سلام خدمت دوستان من تو برنامه دارم یه تعداد کاراکتر رو جایگزین می کنم تو متن این بخش به خوبی انجام میشه اما وقتی می خوام این متن رو با کد زیر به حالت اولیش برگردونم برنامه هنگ می کنه
تعداد کاراکتر هم حدود 14000 هست چطور می تونم مانع هنگ برنامه بشم و عملیات هم زودتر انجام بشه


int espe = 0;
string ru = txt;
ru = ru.Replace("/**/", "\r\n");
for (int i = 0; i < ru.Length; i++)
{
if (ru[i] == '/')
{
if (ru[i + 1] == '*')
{
int imem = i;
i += 2; ;
string mp = "";
while (ru[i] != '*')
{
mp += ru[i++];
}//end while
espe = Convert.ToInt32(mp.Length);
int cun = 0;
string esj = "";
while (espe >= cun)
{

cun++;
esj += " ";

}//end while


ru = ru.Replace(mp, esj);

}
}//end if


}//end for
ru = ru.Replace("/*", "");
ru = ru.Replace("*/", "");
txt = ru;

}//end reanalys

spring69
پنج شنبه 14 مهر 1390, 20:05 عصر
سلام.
1- کد رو بهینه تر کنید.
2- از thread استفاده کنید.

spring69
پنج شنبه 14 مهر 1390, 20:17 عصر
وظیفه حلقه ای که نوشتید چیه؟

mehran_sh_t
پنج شنبه 14 مهر 1390, 20:43 عصر
میشه، نمونه رشته ای که باید تبدیل بشه رو هم بذارید

sara_aryanfar
پنج شنبه 14 مهر 1390, 21:16 عصر
من رشته مورد نظر رو قرار میدم در رشته مورد نظر تعدادی عدد وجود داره که نشانگر تعداد اسپیس در اون نقطه هست و من می خوام اون اعداد رو بر دارم و به جاش اسپیس متناظر رو بزارم
مثلا در این رشته
aaaaaaaaa/*5*/bbbbbbbbbbb
عدد 5 رو برداره و به جاش 5 اسپیس بزاره ودر پایان این علائم رو هم حذف کنیم /*و*/
وظفه حلقه for هم بررسی تک تک کاراکتر ها هست

فایل من (http://up.iranblog.com/images/sbohv6c3juin746tjzzy.zip)

s3rv3r
پنج شنبه 14 مهر 1390, 21:24 عصر
اينجور كه از كدهاشون معلومه. گويا ميخواد ايشون به جاي توضيحات تو رشته اي كه وارد ميكنه( احتمالا رشته هم كد برنامه نويسي هست) ميخواد توضيحات رو با كاراكتر space پر كنه.
خب شما براي يك چنين عمليت سنگيني كه سي پي يو رو مشغول ميكنه بايد از Thread استفاده كنيد

s3rv3r
پنج شنبه 14 مهر 1390, 21:27 عصر
ببخشيدا شما با اين خط
espe = Convert.ToInt32(mp.Length);
طولش رو تبديل به عدد ميكنيد نه خود عدد رو. بنابر اين تو اون رشته كه قرار داديد يه فاصله ميندازه فقط

sara_aryanfar
پنج شنبه 14 مهر 1390, 21:28 عصر
راستش خودم هم می خوام از تایرد استفاده کنم اما می خوام ببینم الگوریتم سادتری میشه گذاشت که سرعت رو بیشتر کنه

sara_aryanfar
پنج شنبه 14 مهر 1390, 22:18 عصر
من حتی از تایرد هم استفاده کردم اما مشکل هنگ برطرف نشد کل برنامه رو قرار میدم به همراه متن دوستان لطفا یه نگاهی بهش بندازید فایل مورد نظر رو با دکمه بالا اد کرده بعد آنالیز و بعد از اون عکس عمل آنالیز رو بزنید آنالیز رو بدون مشکل انجام میده اما عکسشو نه

دانلود (http://up.iranblog.com/images/1jc8jhp1a7kuc2lfjh99.zip)

mehran_sh_t
پنج شنبه 14 مهر 1390, 22:28 عصر
راستش خودم هم می خوام از تایرد استفاده کنمتلفظ صحیحش ترد (tred) هستش. امیدوارم سوء برداشت نشه، همه اینجاییم که از هم یاد بگیریم.
یه راهی به نظرم اومد، رو فایلتون اجرا می کنم، اگر جواب داد می گم :) با استفاده از indexof (فعلا اشتباهه! حواسم به خواستتون نبود!)

mehran_sh_t
پنج شنبه 14 مهر 1390, 22:57 عصر
مشکل حل شد!!! :)
اولین ایراد اینه که اینجا نباید از thred استفاده کنید، چند بار اعمال یک تابع به این متن، معلوم نیست هر کدوم در چه مرحله ای هستش، و ممکنه قاطی کنه!
من نمی دونم چرا! ولی با اضافه کردن این خط کد، برنامه عمل معکوس رو هم به سرعت انجام میده!!!

i += espe;
این رو دقیقا قبل از اتمام حلقه for اضافه کردم (درون حلقه)

** در ضمن، در دی آنالیز، فقط یک بار تابع رو فراخونی کردم، کد های مربوط به ترد رو کامنت کنید...

spring69
پنج شنبه 14 مهر 1390, 23:01 عصر
تو حلقه رشته رو دستکاری و در نتیجه طول رشته رو هم دستکاری میکنید
از این کد استفاده کنید:
public void reanalys()
{
string ru = txt;
ru = ru.Replace("/**/", "\r\n");
int rr = ru.Length;
string sss = "";
for (int i = 0; i < rr; i++)
{
if (ru[i] == '/' && ru[i + 1] == '*')
{
i += 2;
string mp = "";
while (ru[i] != '*')
{
mp += ru[i++];
}//end while
int espe = Convert.ToInt32(mp);
string esj = new string(' ', espe);
sss += esj;
}//end if
else
{
sss += ru[i];
}
}//end for
sss = sss.Replace("/*", "");
sss = sss.Replace("*/", "");
txt = sss;
}//end reanalys

sara_aryanfar
پنج شنبه 14 مهر 1390, 23:02 عصر
من کل پروژه رو قرار دادم

sara_aryanfar
پنج شنبه 14 مهر 1390, 23:11 عصر
تو حلقه رشته رو دستکاری و در نتیجه طول رشته رو هم دستکاری میکنید
از این کد استفاده کنید:
public void reanalys()
{
string ru = txt;
ru = ru.Replace("/**/", "\r\n");
int rr = ru.Length;
string sss = "";
for (int i = 0; i < rr; i++)
{
if (ru[i] == '/' && ru[i + 1] == '*')
{
i += 2;
string mp = "";
while (ru[i] != '*')
{
mp += ru[i++];
}//end while
int espe = Convert.ToInt32(mp);
string esj = new string(' ', espe);
sss += esj;
}//end if
else
{
sss += ru[i];
}
}//end for
sss = sss.Replace("/*", "");
sss = sss.Replace("*/", "");
txt = sss;
}//end reanalys
با این کد عملیات با سرعت انجام میشه اما متن به حالت اصلی بر نمی گرده و تعدادی / اضافه میزاره در کل مشکل کد من چی بود

spring69
پنج شنبه 14 مهر 1390, 23:26 عصر
من وقت اینکه کامل بشینم برات بنویسم که ندارم.
فقط این نمونه رو دادم که بدونی مشکلت چیه.
حالا شرح مشکل
شما اگر یه دیباگ بکنی متوجه میشی که ( for (int i = 0; i < ru.Length; i++ چه بلایی سر i میاره.
به ru.Length دقت کن.
با دستورات داخل حلقه طول کم و زیاد میشه و در نتیجه i هم بارها کم میشه و یه جور حلقه بی نهایت یا خیلی بزرگ تولید میشه.
کلا تو نوشتن کد بیشتر دقت کن
این کدی که دادم به هیچ وجه تضمین نمیکنم که درست کار کنه و فقط واسه نمونه هست.

در مورد / اضافی:
string ru = txt;
ru = ru.Replace("/**/", "\r\n");
int rr = ru.Length;
string sss = "";
for (int i = 0; i < rr; i++)
{
if (ru[i] == '/')
{
if (ru[i + 1] == '*')
{
i += 2;
string mp = "";
while (ru[i] != '*')
{
mp += ru[i++];
} //end while
int espe = Convert.ToInt32(mp);
string esj = new string(' ', espe);
sss += esj;
}

}//end if
else
{
sss += ru[i];
}
}//end for
sss = sss.Replace("/*", "");
sss = sss.Replace("*/", "");
txt = sss;
}//end reanalys

sara_aryanfar
پنج شنبه 14 مهر 1390, 23:45 عصر
در عمیلیات معکوس کردن تعدادی اسپیس اضافی تولید میشه اینه چطوری میشه جلوشو گرفت 76315تصویر فایل ها رو ببینید متن جابجا شده
و سوال دوم اینکه مگهru.Length طول متن ما نیست وقتی داخل فور هست چرا حلفه بی نهایت تولید می کنه؟

spring69
جمعه 15 مهر 1390, 00:09 صبح
مشکل اسپیس از آنالیزتون هست.
مقدار ru رو ببینید متوجه میشید.
همه اون اسپیس ها وجود داشته.
آنالیز رو دوباره بررسی کنید.
thread رو هم غیر فعال کنید چون طرز نوشتنش هم اشتباه هست.

spring69
جمعه 15 مهر 1390, 00:13 صبح
اسپیس های اضافه در اول هر خط، علتش اسپیس های اضافه در آخر خط قبل هست.

spring69
جمعه 15 مهر 1390, 00:36 صبح
public void analys()
{

bool spe = false;
int a = 0;
string m = txt.TrimEnd(), mo = "";
List<string> lst = new List<string>();
foreach (char item in m)
{
if (item == '\r')
{
mo = mo.Replace(Environment.NewLine, string.Empty);
lst.Add(mo);
mo = "";
spe = false;
}
else
{
if (item == ' ')
{
spe = true;
a++;
//textBox2.Text += "/*";
}
else
{
if (spe)
{
mo += "/*" + a + "*/";
spe = false;
a = 0;
}
mo += "" + item;
}
}
}
txt = string.Join(@"/**/", lst.ToArray());
}//

ولی یک نکته:
به جای درگیر شدن با کاراکتر های انتهای خط و غیره میتونید از ReadAllLines به جای ReadAllText استفاده کنید و از اول تو یه لیست ذخیره کنید داده هارو.