PDA

View Full Version : سوال: اجرا دستورات به صروت پیاپی و ندادن وقفه به دستورات دیگه ؟



samadblaj
دوشنبه 09 بهمن 1391, 16:57 عصر
سلام و خسته نباشید...

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

مشکل اینه که وقتی دستورات به پایان رسید یک مرتبه پیماشگر پر میشه؟ :خجالت:
فکر کردم با قرار دادن کد زیر میشه یه وقفه ایجاد کرد و مقدار پیمایش به حالت نرمال برسه اما نشد...
Thread.Sleep(100);

لطفا راهنماییم کنید

Y_Safaiee
دوشنبه 09 بهمن 1391, 19:23 عصر
سلام دوست خوبم

با استفاده از ترد نوشتیش یا نه؟

با استفاده از ترد و راحت تر BackgroundWorker میشه لحظه به لحظه از پیش رفت مطلع و نمایش داد.

لطفا در صورت امکان کد یا توضیح کامل تری رو بیان کنین

مرسی دوست خوبم

موفق باشی
بایت بایت

samadblaj
دوشنبه 09 بهمن 1391, 20:28 عصر
سلام
دوست خوبم ممنونم از لطفتون...

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

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

در پروژه پیوستی تابع more رو میخوام بذارم در پشت backGroundWorker .

ممنون میشم کمکم کنید.

با تشکر

Y_Safaiee
دوشنبه 09 بهمن 1391, 20:49 عصر
سلام دوست خوبم

میشه چنین کدی نوشت حتی میشه Sleep رو هم برداشت چون تو پردازشهای سنگین خود ترد Sleep رو مدیریت میکنه



using System.Threading;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
}

private void button1_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i <= 500; i++)
{
Thread.Sleep(1);
textBox1.Text = "test" + i.ToString();
int p = (i/ 500) * 100;
backgroundWorker1.ReportProgress(p);
}
}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
}
}



موفق باشی
بایت بایت

aliasghar2
دوشنبه 09 بهمن 1391, 21:03 عصر
سلام

باید از application.dowork()
صد در صد جواب میده بزار جای sleep

samadblaj
دوشنبه 09 بهمن 1391, 21:26 عصر
سلام دوست خوبم

میشه چنین کدی نوشت حتی میشه Sleep رو هم برداشت چون تو پردازشهای سنگین خود ترد Sleep رو مدیریت میکنه



using System.Threading;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
}

private void button1_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i <= 500; i++)
{
Thread.Sleep(1);
textBox1.Text = "test" + i.ToString();
int p = (i/ 500) * 100;
backgroundWorker1.ReportProgress(p);
}
}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
}
}



موفق باشی
بایت بایت

سلامی دوباره عالی بود واقعا دست و پنجت درد نکنه....

خیلی کمکم کرد.



سلام

باید از

application.dowork()

صد در صد جواب میده بزار جای sleep

سلام از شما هم تشکر میکنم در کد اصلا نیاز به sleep نداشتم فقط میخواستم در حلقه مکثی ایجاد شود قرار دادم برای مشاهده responsid برنامه بود....

بازم تشکر میکنم موفق باشید./ :تشویق:

samadblaj
دوشنبه 09 بهمن 1391, 21:52 عصر
بعد ببخشید یه سوال دیگه اگه در قسمت زیر

int p = (i/ 500) * 100;

تابع یک حلقه نباشه مثلا چند تا تابع رو تحت پیمایش progress قرار بده به چه شکل میشه؟

aryasoft2872
دوشنبه 09 بهمن 1391, 22:36 عصر
بعد ببخشید یه سوال دیگه اگه در قسمت زیر

int p = (i/ 500) * 100;

تابع یک حلقه نباشه مثلا چند تا تابع رو تحت پیمایش progress قرار بده به چه شکل میشه؟

مقدار p عدد اختیاریه مثلا فرض کنیم 5 مرحله با زمان تقریبا برابر داریم برای حلقه اول توی ReportProgress می تونید مقدار زیر رو ارسال کنید:

int p = (i / (500 * 5)) * 100
حالا درصد یک تا بیست اختصاص داره به حلقه اول و به همین صورت می تونید مراحل دیگه رو هم پیاده کنید.

aryasoft2872
دوشنبه 09 بهمن 1391, 22:39 عصر
البته اگه وسط DoWork هم خواسستید یکی از اشیای توی UI رو تغییر بدید از این کد می تونید استفاده کنید:

App.Current.Dispatcher.BeginInvoke((Action)delegat e
{
// Update GUI here.
}, null);

samadblaj
سه شنبه 10 بهمن 1391, 13:18 عصر
مقدار p عدد اختیاریه مثلا فرض کنیم 5 مرحله با زمان تقریبا برابر داریم برای حلقه اول توی ReportProgress می تونید مقدار زیر رو ارسال کنید:

int p = (i / (500 * 5)) * 100
حالا درصد یک تا بیست اختصاص داره به حلقه اول و به همین صورت می تونید مراحل دیگه رو هم پیاده کنید.

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


int p = (i / (500 * 5)) * 100
با تشکر

aryasoft2872
پنج شنبه 19 بهمن 1391, 22:47 عصر
سلام لطفا شما اصلا حلقه منو نادیده بگیرید فکر کنید توی تابع فقط کد باز کردن کانکشن هست کد زیر به چه شکل میشه ؟


int p = (i / (500 * 5)) * 100
با تشکر

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

(اگه متوجه منظورم نشدید توی محیط Winforms یک progressbar بزارید و استایلش رو بزارید روی Marquee، برای کانشکشن اصولا از این شکل استفاده میشه)

samadblaj
پنج شنبه 19 بهمن 1391, 22:59 عصر
بازکردن کانکشن فک نکنم بشه تیکه تیکه اش کرد و از استایل هایی باید استفاده کنید که وابسته به مقدار Progress نباشه با توجه به دیزاین نرم افزارتون خودتون هم می تونید از ایده های دیگه ای استفاده کنید.
سلام ؛

بله دقیقا منظورم همین شکل بود ممنونم این ابهامم هم روشن شد! :تشویق:

aliasghar2
پنج شنبه 19 بهمن 1391, 23:12 عصر
سلام

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

1
int p = (i / (500 * 5)) * 100




با تشکر
سلام من بحث رو یه بار دیگه خوندم وچیزی که متوجه شدم این بود که چه جوری میشه یک خط که زمان طولانی را مصرف می کنه رو از doWork استفاده کنی
مثل connection
خب معمولا برنامه به صورت خط به خط اجرا میشه و Dowork هم هر جا باشه اجرا میشه
معمولا این جور زمان ها خظ هایی که زمان بشتر نیاز دارن و برای اینکه برنامه هنگ نکنه از thread یا backGround Worker استفاده میشه

samadblaj
پنج شنبه 19 بهمن 1391, 23:45 عصر
سلام من بحث رو یه بار دیگه خوندم وچیزی که متوجه شدم این بود که چه جوری میشه یک خط که زمان طولانی را مصرف می کنه رو از doWork استفاده کنی
مثل connection
خب معمولا برنامه به صورت خط به خط اجرا میشه و Dowork هم هر جا باشه اجرا میشه
معمولا این جور زمان ها خظ هایی که زمان بشتر نیاز دارن و برای اینکه برنامه هنگ نکنه از thread یا backGround Worker استفاده میشه

اول از شما تشکر میکنم...
بله من دلیل استفاده از نخ ها و BackGroundWorker رو میدونم فقط این سوال برام پیش اومده بود که اگه قرار بود درصد باز کردن یک کانکشن رو نمایش بدیم به چه شکل میشد که دوست خوبمون آقای aryasoft2872 جواب رو دادن...
مرسی