PDA

View Full Version : خروج از حلقه تکرار بی نهایت



alinaghiha
سه شنبه 14 دی 1395, 12:52 عصر
خسته نباشید یک کد حلقه تکرار دارم که میخوام با یک کلید یا دکمه ازش خارج بشم لطفا راهنمایی بفرمایید

private void button1_Click(object sender, EventArgs e) {

SetCursorPos(550, 680);
do
{
SetCursorPos(550, 680);
Thread.Sleep((int)TimeSpan.FromSeconds(5).TotalMil liseconds);
SendClick();

}
while (true);


}

mehran6764
سه شنبه 14 دی 1395, 13:10 عصر
این قسمتی از while که جلوش نوشتی true ، یه متغیر سراسری بولین بزار مثلا اسمش cheak_exit باشه که به صورت پیش مقدارش true هست ..بعدش برا رویداد کلیک دکمه ای که میخوای حلقه رو تموم کنه این کدو بنویس




cheak_exit=false;

محمد رضا فاتحی
سه شنبه 14 دی 1395, 13:11 عصر
می تونید یه متغیر سراسری تعریف کنید که وقتی روی دکمه کلیک شد مقدار true بگیره...و داخل حلقه اون چک کنید وقتی true بود از حلقه break کنید!

*پ.ن: ظاهرا با ارسال دوستمون هم زمان شد!:چشمک:

alinaghiha
سه شنبه 14 دی 1395, 14:04 عصر
مرسی از پاسختون اما وقتی میره داخل حلقه دیگه اجازه کلیک نمی ده

alinaghiha
سه شنبه 14 دی 1395, 14:06 عصر
این قسمتی از while که جلوش نوشتی true ، یه متغیر سراسری بولین بزار مثلا اسمش cheak_exit باشه که به صورت پیش مقدارش true هست ..بعدش برا رویداد کلیک دکمه ای که میخوای حلقه رو تموم کنه این کدو بنویس




cheak_exit=false;



مرسی اما امکان هیچ کاری در حلقه بی نهایت نیست من نیاز به یک روشی بصورت Runtime هستم که اگه کلیدی ارسال شد از حلقه بیاد بیرون

alireza_s_84
سه شنبه 14 دی 1395, 14:25 عصر
مرسی اما امکان هیچ کاری در حلقه بی نهایت نیست من نیاز به یک روشی بصورت Runtime هستم که اگه کلیدی ارسال شد از حلقه بیاد بیرون
وقتی حلقه در Thread اصلی اجرا بشه کل ترد رو قفل میکنه. باید توی یک ترد جداگانه اجرا بشه.

ژیار رحیمی
چهارشنبه 15 دی 1395, 01:47 صبح
خسته نباشید یک کد حلقه تکرار دارم که میخوام با یک کلید یا دکمه ازش خارج بشم لطفا راهنمایی بفرمایید

private void button1_Click(object sender, EventArgs e) {

SetCursorPos(550, 680);
do
{
SetCursorPos(550, 680);
Thread.Sleep((int)TimeSpan.FromSeconds(5).TotalMil liseconds);
SendClick();

}
while (true);


}

سلام کدهای داخل حلقه while شامل توابعی ست که در MainThread اجرا میشود و بصورت دائم مشغول اجرا شدن در Thread اصلی برنامه ست که کار درستی نمی باشد و باعث هنگ کردن UI برنامه خواهد شد(در صورتیکه MainThread در حال اجرای حلقه While هست اگر دکمه ایی روی فرم کلیک شود رویداد آن فراخوانی نمیشود).بهتر از یک Task که قابلیت Cancellation شدن آن فعال یاشد استفاده نمایید.

CancellationTokenSource tokenSource = new CancellationTokenSource();
private void Form4_Load(object sender, EventArgs e)
{
CancellationToken token = tokenSource.Token;
Task.Run(() =>
{
Invoke((MethodInvoker) delegate {
//TODO write your code
//SetCursorPos(550, 680);
//Thread.Sleep((int)TimeSpan.FromSeconds(5).TotalMil liseconds);
//SendClick();
});
}, token);
}
private void button2_Click(object sender, EventArgs e)
{
tokenSource.Cancel();
}

http://binary-studio.com/2015/10/23/task-cancellation-in-c-and-things-you-should-know-about-it/
https://msdn.microsoft.com/en-us/magazine/gg598924.aspx

مهرداد صفا
چهارشنبه 15 دی 1395, 09:57 صبح
خسته نباشید یک کد حلقه تکرار دارم که میخوام با یک کلید یا دکمه ازش خارج بشم لطفا راهنمایی بفرمایید

private void button1_Click(object sender, EventArgs e) {

SetCursorPos(550, 680);
do
{
SetCursorPos(550, 680);
Thread.Sleep((int)TimeSpan.FromSeconds(5).TotalMil liseconds);
SendClick();

}
while (true);


}

سلام.
همونطور که دوستان اشاره کردند، وقتی شما Thread اصلی برنامه رو در حالت Sleep قرار میدید و یا به هر نحوی مشغولش می کنید به طوری که نمیتونه به Message های ویندوز جواب بده، برنامه حالت not responding پیدا می کنه. فقط در تکمیل پاسخ ها اضافه کنم اگر مثلا قصد دارید ویندوز XP رو هم پشتیبانی کنید و نمیتونید از TPL استفاده کنید، میتونید با استفاده از فرمان Application.DoEvents از برنامه بخواید که پیام های صف شده رو پاسخ بده و بعد حلقه رو ادامه بده.
به این شکل:


Stopwatch delayTimer=new Stopwatch();
do
{
SetCursorPos(550, 680);
delayTimer.Start();
while(delayTimer.ElapsedMilliseconds<5000)
{
Application.DoEvents();
}
SendClick();
delayTimer.Reset();
delayTimer.Stop();
}

while (running);

void buttonClick(Object sender,EventArgs args)
{
running=false;
}