خروج از حلقه تکرار بی نهایت
خسته نباشید یک کد حلقه تکرار دارم که میخوام با یک کلید یا دکمه ازش خارج بشم لطفا راهنمایی بفرمایید
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 که جلوش نوشتی true ، یه متغیر سراسری بولین بزار مثلا اسمش cheak_exit باشه که به صورت پیش مقدارش true هست ..بعدش برا رویداد کلیک دکمه ای که میخوای حلقه رو تموم کنه این کدو بنویس
cheak_exit=false;
نقل قول: خروج از حلقه تکرار بی نهایت
می تونید یه متغیر سراسری تعریف کنید که وقتی روی دکمه کلیک شد مقدار true بگیره...و داخل حلقه اون چک کنید وقتی true بود از حلقه break کنید!
*پ.ن: ظاهرا با ارسال دوستمون هم زمان شد!:چشمک:
نقل قول: خروج از حلقه تکرار بی نهایت
مرسی از پاسختون اما وقتی میره داخل حلقه دیگه اجازه کلیک نمی ده
نقل قول: خروج از حلقه تکرار بی نهایت
نقل قول:
نوشته شده توسط
mehran6764
این قسمتی از while که جلوش نوشتی true ، یه متغیر سراسری بولین بزار مثلا اسمش cheak_exit باشه که به صورت پیش مقدارش true هست ..بعدش برا رویداد کلیک دکمه ای که میخوای حلقه رو تموم کنه این کدو بنویس
cheak_exit=false;
مرسی اما امکان هیچ کاری در حلقه بی نهایت نیست من نیاز به یک روشی بصورت Runtime هستم که اگه کلیدی ارسال شد از حلقه بیاد بیرون
نقل قول: خروج از حلقه تکرار بی نهایت
نقل قول:
نوشته شده توسط
alinaghiha
مرسی اما امکان هیچ کاری در حلقه بی نهایت نیست من نیاز به یک روشی بصورت Runtime هستم که اگه کلیدی ارسال شد از حلقه بیاد بیرون
وقتی حلقه در Thread اصلی اجرا بشه کل ترد رو قفل میکنه. باید توی یک ترد جداگانه اجرا بشه.
نقل قول: خروج از حلقه تکرار بی نهایت
نقل قول:
نوشته شده توسط
alinaghiha
خسته نباشید یک کد حلقه تکرار دارم که میخوام با یک کلید یا دکمه ازش خارج بشم لطفا راهنمایی بفرمایید
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/...know-about-it/
https://msdn.microsoft.com/en-us/magazine/gg598924.aspx
نقل قول: خروج از حلقه تکرار بی نهایت
نقل قول:
نوشته شده توسط
alinaghiha
خسته نباشید یک کد حلقه تکرار دارم که میخوام با یک کلید یا دکمه ازش خارج بشم لطفا راهنمایی بفرمایید
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;
}