PDA

View Full Version : سوال: مشکل تعجب انگیز در ویژوال استودیو 2010



arash69
پنج شنبه 11 اردیبهشت 1393, 16:08 عصر
سلام به همه دوستان؛
در رابطه با اجرای گام به کام برنامه در ویژوال استودیو، سوالی داشتم که برای خودم هم تعجب انگیز هست!
وقتی برنامه رو به صورت معمولی اجرا میکنم، پس از مقداری اجرا ظاهرا" وارد یک حلقه ی بی نهایت میشه که با توجه به درست بودن منطق برنامه، چنین چیزی امکان پذیر نیست.
به همین خاطر برای یافتن مشکل برنامه رو گام به گام اجرا کردم؛ و به یک مشکل تعجب برانگیز رسیدم؛
اینکه پس از مدتی اجرای برنامه، وقتی داخل یک تابع مشخص میشه، بدون اجرای کامل تابع، از آن خارج شده و به نقطه ی فراخوانی بازگشته و به اجرای برنامه ادامه میدهد و
گویا همین مشکل باعث حلقه ی بی نهایت در برنامه میشه.

دوستان اگر میدونند که این مشکل به چه دلیلی پیش میاد، لطفا راهنمایی کنند.

ممنون.

parvizwpf
پنج شنبه 11 اردیبهشت 1393, 16:16 عصر
کد رو بزارید لطفا

arash69
پنج شنبه 11 اردیبهشت 1393, 23:31 عصر
کد رو بزارید لطفا

کد قسمتی از برنامه که مربوط به مشکل میشه:

private void button4_Click(object sender, EventArgs e)
{
List<string> ips = ipCollector();
SqlConnection con = new SqlConnection("Data Source=localhost;Initial Catalog=sitelog;Integrated Security=True;");
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "SELECT ip,rday,rhour,rminute,userAgent FROM requests WHERE ip=@p1";
cmd.Parameters.Add("@p1",SqlDbType.NVarChar);


for (int i = 0; i < ips.Count; i++)
{
List<List<string>> iprequests = new List<List<string>>();
cmd.Parameters["@p1"].Value = ips[i];
con.Open();
SqlDataReader rd = cmd.ExecuteReader();
while (rd.Read())
{
List<string> request = new List<string>();
request.Add(rd["ip"].ToString());
request.Add(rd["rday"].ToString());
request.Add(rd["rhour"].ToString());
request.Add(rd["rminute"].ToString());
request.Add(rd["userAgent"].ToString());


iprequests.Add(request);
}
con.Close();
agentFrequency(iprequests);
}
}


private void agentFrequency(List<List<string>> temp)
{
string agentFrequence = null;
SqlConnection con = new SqlConnection("Data Source=localhost;Initial Catalog=sitelog;Integrated Security=True;");
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "INSERT INTO UAFrequency VALUES(@p1,@p2)";
cmd.Parameters.Add("@p1",SqlDbType.VarChar);
cmd.Parameters.Add("@p2",SqlDbType.NText);
List<int> time = new List<int>();
time.Add(int.Parse(temp[0][1]));
time.Add(int.Parse(temp[0][2]));
time.Add(int.Parse(temp[0][3]));
List<int> upRange = timeIterator(time);
bool finish=false;
int ipNum = 0;
while(!finish)
{
List<string> userAgent = new List<string>();
int agentCounter = 0;
for (int j = ipNum; j < temp.Count; j++)
{
if (int.Parse(temp[j][1]) == upRange[0])
{
if (int.Parse(temp[j][2]) == upRange[1])
{
if (int.Parse(temp[j][3]) <= upRange[2])
{
ipNum++;
if (!(agentController(userAgent, temp[j][4])))
{
agentCounter++;
userAgent.Add(temp[j][4]);
}
}
}
else if (int.Parse(temp[j][2]) < upRange[1])
{
if (int.Parse(temp[j][3]) > upRange[2])
{
ipNum++;
if (!(agentController(userAgent, temp[j][4])))
{
agentCounter++;
userAgent.Add(temp[j][4]);
}
}
}
}
else if (int.Parse(temp[j][1]) < upRange[0])
{
if (int.Parse(temp[j][2]) > upRange[1])
{
if (int.Parse(temp[j][3]) > upRange[2])
{
ipNum++;
if (!(agentController(userAgent, temp[j][4])))
{
agentCounter++;
userAgent.Add(temp[j][4]);
}
}
}
}
}
agentFrequence += (agentCounter.ToString()) + ",";
upRange = timeIterator(upRange);
if (ipNum >= temp.Count)
{
finish = true;
}
}
cmd.Parameters["@p1"].Value=temp[0][0];
cmd.Parameters["@p2"].Value = agentFrequence;
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}


private bool agentController(List<string> agents, string usedAgent)
{
bool inList = false;
for (int i = 0; i < agents.Count; i++)
{
if (agents[0] == usedAgent)
inList = true;
}


return inList;
}


private List<int> timeIterator(List<int> temp)
{
List<int> upRange = new List<int>();
int rday = temp[0];
int rhour=temp[1];
int rminute = temp[2];
if (((rminute + 30) / 60) > 0)
{
rminute = (rminute + 30) % 60;
if ((rhour + 1) / 24 == 0)
{
rhour++;
}
else if ((rhour + 1) / 24 > 0)
{
if (((rday + 1) / 30) > 0)
{
rday = (rday + 1) % 30;
}
else
rday++;
}
}
else
rminute+=30;


upRange.Add(rday);
upRange.Add(rhour);
upRange.Add(rminute);
return upRange;
}

parvizwpf
جمعه 12 اردیبهشت 1393, 00:57 صبح
بابا دمت گرم الان چی به چیه کدوم لوپ گیر میکنه؟

arash69
جمعه 12 اردیبهشت 1393, 10:52 صبح
بابا دمت گرم الان چی به چیه کدوم لوپ گیر میکنه؟

با توجه به اینکه تابع timeIterator زمان رو 30 دقیقه به 30 دقیقه جلو میبره، تابع agentFrequency از این تابع توی پایان حلقه های For و داخل حلقه while استفاده میکنه.
مشکلی که هست اینه که، پس از گذشت مدتی از اجرای برنامه، تابع timeIterator کامل طی نمیشه و پس از طی مثلا یکی دو دستور از این تابع، خارج شده و به تابع قبلی یعنی
agentFrequency برمیگرده که ظاهرا" همین مشکل باعث خارج نشدن از حلقه ی while میشه چرا که شرط خارج شدن از حلقه ی while رسیدن ipNum به یه مقدار خاص هست و
این متغیر توی if ها مقدارش افزایش پیدا میکنه که ظاهرا" بخاطر عدم طی شدن صحیح تابع timeIterator، شرط های if ها صحیح در نمیاد و این متغیر هم به مقدار مورد نظر نمیرسه و
گویا همین نکته هم باعث میشه تا حلقه ی بی نهایت while ایجاد بشه.

parvizwpf
جمعه 12 اردیبهشت 1393, 14:53 عصر
من واقعا نمیدونم چی بگم. بنظرم خودت تریس کنی بهتر باشه. چون من گیچ شدم واقعا و نمیتونم تمرکز کنم رو کدت. شرمنده دوست عزیز.معمولا وقتی این اتفاق رخ میده که زمانی که داره توی حلقه سپری میشه توسط جاهای دیگر برنامه تلف بشه.

arash69
جمعه 12 اردیبهشت 1393, 16:35 عصر
من واقعا نمیدونم چی بگم. بنظرم خودت تریس کنی بهتر باشه. چون من گیچ شدم واقعا و نمیتونم تمرکز کنم رو کدت. شرمنده دوست عزیز.معمولا وقتی این اتفاق رخ میده که زمانی که داره توی حلقه سپری میشه توسط جاهای دیگر برنامه تلف بشه.

خب خیلی ممنون از نظرتون؛ اما برای حل همین مشکلی که گفتین، چه میشه کرد؟

Mahmoud.Afrad
جمعه 12 اردیبهشت 1393, 20:50 عصر
دلیل این عدم تمرکز اینه که کد ایشون به قول گفتنی کثیف نوشته شده. بهتره کدشو تمیز بنویسه و اگر میتونه در قالب یه پروژه بزاره تا تست کنیم

parvizwpf
شنبه 13 اردیبهشت 1393, 00:11 صبح
من وافعا شرمنده ام. برای حل اون مشکل خب ببیند مشکلی نیست که بگید باید پیدا بشه. شما باید کدتون رو از گره هایی که ممکنه وجود داشته باشه رهایی بدید میگم من احساسم اینه که مشکل توی زمانبندیه اجرای حلقه هاست تا جایی که تجربه کوچک من جوابگوست.مطمئنا با تریس میتونید گیرش رو رفع کنید. حلاصه عذر تقصیر.

javadaskari
شنبه 13 اردیبهشت 1393, 19:56 عصر
فکر میکنم از توابع بازگشتی استفاده میکنی(توابعی که خودشون رو فراخوانی میکنند) ، که اگه دقت لازم را نداشته باشی وارد حلقه بینهایت میشه ، حلقه لزوما با for ایجا دنمیشه.

daniyaltjm
شنبه 13 اردیبهشت 1393, 21:12 عصر
من از کدت زیاد سر در نیاوردم ولی شاید به خاطر اینه که داخل شرط حلقه هات از > استفاده کردی باید از => استفاده بکنی