PDA

View Full Version : سوال: اضافه کردن کامپوننت به فرم با استفاده از backgroundWorker



alireza_tavakol
جمعه 04 بهمن 1387, 12:04 عصر
public Form1()
{
InitializeComponent();
}

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

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
System.Windows.Forms.Button a = new Button();
a.Location = new System.Drawing.Point(100, 60);
a.Size = new System.Drawing.Size(80, 70);

System.Windows.Forms.Form b = new Form();

b.Controls.Add(a);
b.Show();
}
این کدی که من نوشتم یک مثال است برای نشان دادن مشکلم

در زمان اجرا این کد برنامه (Not Responding) میشود! چرا؟ چگونه مشکلم را حل کنم؟

Sajjad.Aghapour
جمعه 04 بهمن 1387, 12:44 عصر
داخل رویداد RunWorkerCompleted کدتون رو بنویسید...

alireza_tavakol
جمعه 04 بهمن 1387, 13:16 عصر
من در داخل این رویداد کدی ننوشتم ولی شما فرض کن کد زیر رو هر به برنامه اضافه کنیم


private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("ok");
}

Sajjad.Aghapour
جمعه 04 بهمن 1387, 13:55 عصر
منظور این بود که b.show رو داخل رویداد RunWorkerCompleted بنویسید..
موفق باشید...

alireza_tavakol
جمعه 04 بهمن 1387, 18:49 عصر
خیلی ممنون مشکلم حل شد

ولی می تونید علت بروز این مشکل رو برام توضیح بدید؟:متفکر:

Sajjad.Aghapour
جمعه 04 بهمن 1387, 19:03 عصر
DoWork کارهایی رو انجام میده که باید در پشت صحنه انجام بشه.شما قبل از اینکه این کارها به پایان برسه(یعنی همون پروسه DoWork) فرمت رو show کردی و این باعث قفل شدن و NotRespond شدن اون میشد....

alireza_tavakol
شنبه 05 بهمن 1387, 06:59 صبح
ببخشید ولی سوال دیگه ای که تقریبا برای من مطرح شده : مگه نه اینکه متد CancelAsync در صورت برقراری خصوصیت WorkerSupportsCancellation باعث متوقف شدن رویداد DoWork میشود ؟

ولی اگه توی رویداد DoWork یه حلقه for داشته باشم متد CancelAsync باعث توقف کار نمیشه !

حالا اگه من توی رویداد DoWork یه حلقه for داشته باشم چطوری میتونم باعث توقف رویداد DoWork بشم؟

البته خودم میدونم که با تعریف سراسری متغیر شمارنده حلقه for و مقدار رهی آن می تونم حلقه رو تموم کنم ولی می خوام بدونم راه اصولی برای توقف DoWork در هر حالی دارم یا نه؟

با تشکر از پاسخ های جناب عالی

ahmadsystemco
شنبه 05 بهمن 1387, 08:28 صبح
سلام خدمت دوستان و اساتید و ... ( همه دیگه)

دوست عزیز در جواب سوال شما اگر در نظر بگیریم در یک backgroundworker در حلقه زیر هستیم و می خواهیم با cancelAsync کار متوقف شود به یک if در حلقه نیاز مندیم تا بفهمیم آیا کار ما cancel شده است یا خیر. همانند کد زیر:


while (true)
{
if (backgroundWorker.CancellationPending)
{
break;
}
}
MessageBox.Show("ahamdsystemco");

در ایجا backgroundWorker نام شی ء backgroundWorker است که همچنین می توانید آن را از راه Argument به متد پاس دهید و از آن استفاده کنید.

لازم به ذکر است که برای این کا رشما باید پراپرتی WorkerSupportsCancellation را در backgroundWorkerخود با true مقدار دهی کنید.

امیدوارم به جوابتان رسیده باشید.

با تشکر AHS

hana2064
سه شنبه 29 بهمن 1387, 11:37 صبح
سلام ...
من چند روزیه دارم درباره background workerجستجو می کنم همه مثالها تو این سایت و codprojectرو دیدم اما همشون تو فراخونی متد غیر همزمان از یک حلقه for یا while استفاده می کنن . ولی من تو برنامه ام می خوام در حین ورود کاربر به سیستم و یا گزارشگیری از bgwrker استفاده کنم و نمیتونم از حلقه for استفاده کنم . مثلا وقتی کاربر اطلاعات کاربری رو وارد میکنه و دکمه ورود رو کلیک میکنه تکه کد


DataTable dt = new DataTable();
DataBase db = new DataBase();
string str = "select * from login where usr = '" + textBox1.Text + "' and pas = '" + textBox2.Text + "' ";
dt = db.MySelect(str);
if (dt.Rows.Count == 0)
{
MessageBox.Show("این اطلاعات در جدول وجود ندارد");
}
else
{
Form2 ff = new Form2();
ff.ShowDialog();

}

اجرا میشه . اگه من از حلقه for استفاده نکنم چه جوری می تونم progress رو مقدار بدم .
تو فرم های گزارشگیری هم این مشکل رو دارم و می خوام پیشرفت کار رو به کاربر نشون بدم ولی نمی دونم قراره چند رکورد جستجو بشه چون هر گزارش چندین حالت داره که توسط combo , radio)شروط گزارش ) توسط کاربر انتخاب میشه و هر گزارش زمان متفاوتی طول میشکه..
ممنون میشم از راهنماییتون

hana2064
جمعه 02 اسفند 1387, 00:46 صبح
من منتظر جوابم . لطفا راهنمایی کنید:افسرده::افسرده::افسرده: