PDA

View Full Version : توقف حلقه برای ورود اطلاعات



anahita6
جمعه 08 خرداد 1388, 10:06 صبح
سلام
من یه برنامه نوشتم که توی قسمتی از اون نیاز هست که در یک حلقه یک سری از موارد چک بشه و در حین انجام این کار در هر بار گردش حلقه یک سری از اطلاعات از طریق textbox وارد بشه میخواستم از دوستان سوال کنم چطور میتونم این کار رو انجام بدم . یعنی اینکه حلقه در هر بار چرخش متوقف بشه و صبر کنه تا اطلاعات از طریق textbox ها وارد بشه و بعدش دوباره چرخش رو ادامه بده . یعنی اولا تا اطلاعات وارد نشد دور بعدی حلقه رو شروع نکنه و دوما دوباره به اول ایندکس بر نگرده بلکه از همون جا چرخش رو شروع کنه
ممنون از راهنمایی تون

NewFoxStudent
جمعه 08 خرداد 1388, 12:52 عصر
یه راهش اینه که فرم ورود اطلاعات رو از طریق حلقه اجرا کنی
یعنی توی یه فرم حلقه رو بزاری و برای دریافت اطلاعات از یه فرم دیگه استفاده کنی
و در هر بار اجرای حلقه اون فرم رو اجرا کنی به صورت SHowDialog و اگه نتیجه اجرای فرم OK بود حلقه به کارش ادامه بده

anahita6
جمعه 08 خرداد 1388, 13:17 عصر
آخه فرمم رو نمیتونم تغییر بدم مدیر پروژه میخواد همین جوری باشه. اما فکر کنم یه راهی برای توقف حلقه وجود داشته باشه

Mahdi1001
جمعه 08 خرداد 1388, 13:30 عصر
سلام
میتونی از thread استفاده کنی وقتی تکس باکسات پرشدن یه متغیری True کنی و وقتی thread حلقه اجرا میشه با یه شرط اون متغیره چک می کنی اگه درست بود ادامه میدی وگرنه نگهش میداری . اگه سیستم عامل پاسیدین مثل سمافور میتونی طراحیش کنی .:لبخند:

anahita6
جمعه 08 خرداد 1388, 13:35 عصر
کار با thread رو بلد نیستم . بابا اینقدر سختش نکنید . یعنی بخوام یه حلقه رو نگه دارم باید این همه چیز بدونم؟

Mahdi1001
جمعه 08 خرداد 1388, 13:40 عصر
نه نگه داشتن حلقه کاری نداره تو بگو چند تا فیلد داری اسامیشو نو بده یه راه توپ و سریع و اسان به ذهنم رسید .

anahita6
جمعه 08 خرداد 1388, 13:49 عصر
4 تا فیلد دارم میخوام اینها رو از طریق textbox توی حلقه مقدار دهی کنم اما چیزی که الان اتفاق می افته این هست که مقدار اولی به اندازه تعداد گردش حلقه ثبت میشه . یعنی حلقه نمی ایسته تا مقدار های بعدی رو بگیره .

Mahdi1001
جمعه 08 خرداد 1388, 13:52 عصر
بزار ببینم درست متوجه شدم .
میخوای هر بار که حلقه اجرا میشه اگه این چهار تا فیلد مقدار داشتن ادامه دستورات رو بره اما اگه مقدار نداشتن وایسه تا کار بر داده رو وارد کنه سپس ادامه دستورت رو بره.

anahita6
جمعه 08 خرداد 1388, 13:57 عصر
تقریبا همینطوره

Mahdi1001
جمعه 08 خرداد 1388, 14:07 عصر
for(i=0;i<n;i++)
{
while(fild1==""||fild2==""||fild3==""||fild4=="");
.....
.....
....
....
}

ببین با این موشکلت حل میشه

anahita6
جمعه 08 خرداد 1388, 14:13 عصر
معلومه که نمیکنه . اینجوری وقتی کاربر یک حرف از فیلد آخر رو وارد کرد دیگه فیلد خالی نیست و شرط برقرار میشه و از حلقه میاد بیرون یعنی کافیه ففط یک کاراکتر تایپ بشه تا دیگه فیلد آخر برابر "" نباشه

Mahdi1001
جمعه 08 خرداد 1388, 14:16 عصر
اصلا نیاز به حلقه نیست!
میتونی بدون حلقه این کارو کنی
یه متغیره استاتیک واسه شمارندت بگیر .
یه تابع بنویس و کد دستورات حلقتو بزار توش .
یعنی از این به بعد هر بار تابع فراخانی بشه یک واحد به متغیر استاتیکت اضافه میشه و دستوراتو انجا میده.
مرحله اخر یه تابع بنویس که توش چک کنه همه فیلدات مقدار دارن یا نه اگه همه مقدار داشتن تابع قبلیت که مر بوط به حلقته اجرا کنه و حالا دیگه موشکلی نیست .

anahita6
جمعه 08 خرداد 1388, 14:20 عصر
نه خب حلقه باید حتما باشه برای قسمتهای دیگه ء برنامه ام که اینجا چیزی ازش نگفتم که شلوغ نشه به هیچ وجه نمیتونم حلقه رو حذف کنم و گرنه راه زیاده واسه این کار

Mahdi1001
جمعه 08 خرداد 1388, 14:24 عصر
اگه میتونید کدتونو واسم بفرستید تا ببینم .
چون اینطوری من هر راهی پیشنهاد میکنم یه مشکلی واسه شما داره.:متفکر::متفکر::متفکر:

vahid.bz
جمعه 08 خرداد 1388, 15:09 عصر
for (int i = 0; i < n; i++)
{
bool Flag = false;
while (true)
{
if(textBox1.Text != "" || textBox2.Text != "" || textBox3.Text != "")
{
int BeginTime = System.Environment.TickCount;
while(textBox4.Text != String.Empty && (System.Environment.TickCount - BeginTime)/1000 > 15)
{
//user enter all field
Flag = true;
}
}
if(Flag == true)
break;
}
}
بسته به اینکه فیلد شماره ی 4 چقدر نوشتنش طول می کشه 15 ثانیه رو تغییر بده

NewFoxStudent
جمعه 08 خرداد 1388, 15:42 عصر
به نظر میرسه تنها راه استفاده از فرم اضافی باشه و یا استفاده از InputBox
به خاطر اینکه با این کار کنترل برنامه از حلقه خارج میشه و در صورت برقراری شرایط مورد نیاز دوباره به حلقه برمیگرده

Reza_Yarahmadi
جمعه 08 خرداد 1388, 15:47 عصر
تنها راه استفاده از Thread
چون شما هر نوع حلقه ای استفاده کنید (مثل همون While) برنامه به حالت هنگ کردن میره و نمی تونید فیلدهاتونو پر کنید
میتونید بصورت زیر عمل کنید:
فضای نام زیر رو اضافه کنید:
ُSystem.Threading

یه متغیر سراسری بصورت زیر تعریف کن


Thread t1;


توی هر رویدادی که میخواید حلقه شروع بشه کد زیر رو بنویسید


t1 = new Thread(new ThreadStart(StartLoop));
t1.Start();

حلقه مورد نظرت رو توی یه متد(StartLoop) بنویس(بدون پارامتر و بدون خروجی)
انتهای حلقه دستور زیر رو بنویس


for(...)
{
...
...
t1.Suspend();
}


توی رویدادی که میخوای بعد از پر شدن فیلدها حلقه یک بار دیگه انجام بشه کد زیر رو بنویس


t1.Resume();


امیدوارم اینطوری مشکلت حل بشه!

Mahdi1001
جمعه 08 خرداد 1388, 16:24 عصر
من که از همون اول بهشون گفته بودم از thread استفاده کنند اما خودشون نخواستن . اما راه دومیم که پیشنهاد دادم استفاده از تابع بجای حلقه اونم جواب میده .حالا هر کدوم واستن راهتتره را انتخاب کنید ولی دوستان عزیز هیچ وقت فکر نکنید راهی که به ذهنتون رسیده تنها راه ممکن است برای رسیدن به یک جواب چندین راه وجود دارد.