PDA

View Full Version : اجرای دو دستور با هم



omidaminiazar
یک شنبه 16 مهر 1391, 20:55 عصر
با سلام خدمت اساتید محترم برنامه نویسی
من یک مشکل دارم که وقتی کد زیر اجرا می شود دیگر برنامه قادر به انجام هیچ کار دیگری نیست
for (int i = 0; i <= 100; i++)
{
Thread.Sleep(1000);
y += 10;
label1.Location = new System.Drawing.Point(y, x);
}
این دستور موقعیت لیبل را عوض می کند که تا تمایم حلقه به پایان نرسد کار دیگری نمی کند
می خوام کاری کنم که وقتی این دستور هم که در حال اجرا میباشد برنامه کار خود را انجام دهد و بتوان با آن کار کرد
راهی است که درست بشه

با تشکر امید امینی آذر

morteza271
یک شنبه 16 مهر 1391, 21:07 عصر
باید از تردها استفاده کنید که طریقه ی استفاده از تردها هم خیلی سادس و میتونید با یه جستجو به نتیجه برسین.

BlackPawn
یک شنبه 16 مهر 1391, 21:14 عصر
در vb این طوری این مشکل حل میشه
Application.DoEvents()
در داخل حلقه کد بالا رو بنویس حل میشه ولی از Sleep که استفاده کنی چاره ای نداره جز اینکه یه Sleep خودت بسازی به این صورت که
من کد VB می نویسم خودتون تبدیل کنید

Private Sub NewSleep(ByVal D As Integer)
Dim L As Long = Now.Ticks
Do
Application.DoEvents()
If (Now.Ticks - L > D) Then Exit Do
Loop
End Sub

hakim22
یک شنبه 16 مهر 1391, 21:17 عصر
استفاده از Threading راه اول شماست .
راه دیگه استفاده از BackgroundWorker است.
راه سوم هم استفاده از Timer و قرار دادن کد درون رویداد Tick

omidaminiazar
دوشنبه 17 مهر 1391, 19:01 عصر
مشکل با لطف شما حل شد حالا کد ردیف 8 ارور می ده

Thread th1 = new Thread(
delegate()
{
for (int i = 0; i <= 100; i++)
{
Thread.Sleep(1000);
y += 10;
label1.Location = new System.Drawing.Point(y, x);
}

}
);
th1.Start();


این ارور را می دهد

http://grphics.tk/img/8e918489f1e0.jpg

مشکل از کجا است

morteza271
دوشنبه 17 مهر 1391, 19:23 عصر
کدتون رو به صورت زیر تغییر بدین درست میشه:
private void button1_Click(object sender, EventArgs e)
{
Thread th1 = new Thread(new ThreadStart(Func));
th1.Start();
}

private void Func()
{
this.Invoke(new Action(delegate()
{
{
int x = label1.Location.X;
int y = label1.Location.Y;
for (int i = 0; i <= 100; i++)
{
Thread.Sleep(1000);
y += 10;
label1.Location = new System.Drawing.Point(y, x);
}
}
}));
}