PDA

View Full Version : backgroundWorker



rnm123
یک شنبه 02 فروردین 1388, 21:03 عصر
سلام به همگی
من یک برنامه ای نوشته ام که یک فرم لوگین و یک فرم اصلی دارد. در فرم لوگین کاربر باید کد و رمز خود را وارد کند و پس از زدن کلید تائید برنامه کد و روز را با پایگاه داده مقایسه و در صورت درست بودن فرم اصلی برنامه را فراخوانی میکند. در فرم لوگین یک picturebox با یک تصویر متحرک قرار داده ام که حالت انتظار را نمایش دهد تا زمانی که کاربر کلید تائید را میزند این تصویر نمایش داده شود و برنامه بصورت قفل شده تصور نشود. برای نمایش این حالت یک backgroundWorker تعریف کردم . اما زمانی که در تابع مربوط به backgroundWorker فرم اصلی را تعریف می کنم و آنرا فراخوانی میکنم همه چیز درست کار میکند یعنی تصویر نمایش داده میشود و بعد فرم اصلی نمایش داده میشود ولی چون در فرم اصلی یک folderDialog را فراخوانی میکنم با مشکل برخورد کرده ام چون این دیالوگ باز نمی شود و برنامه به حالت فریز میرود به ناچار در تابع مربوط به backgroundWorker آمدم pictureBox را نمونه سازی کردم و فراخوانی کردم ولی تصویری نمایش داده نمی شود . کسی میتواند مرا کمک کند که مشکل کجاست و یا اصلا در چنین مواردی برای نمایش حالت انتظار بهترین روش چیست ؟

mostafaaa
یک شنبه 02 فروردین 1388, 22:12 عصر
سلام دوست من
اول اینکه کدت رو بزار
دوم اینکه من متوجه نشدم نقش BackgroundWorker این وسط چیه و اصلا چه نیازیه واسه یه کار به این سادگی از MultiThreading استفاده کنیم.
یا علی

rnm123
یک شنبه 02 فروردین 1388, 23:54 عصر
سلام دوست من
اول اینکه کدت رو بزار
دوم اینکه من متوجه نشدم نقش BackgroundWorker این وسط چیه و اصلا چه نیازیه واسه یه کار به این سادگی از MultiThreading استفاده کنیم.
یا علی
با سلامی دوباره
دوست عزیز . این کار اصلا به این راحتی که میگید نیست . البته شاید باشد و من ناوارد باشم که احتمالش هم زیاده به هر حال کد من بصورت زیر است
اول متغیر زار را تعریف کردم:


BackgroundWorker BgWorker = new BackgroundWorker();

بعد یک تابع تعریف کردم:


void BgWorker_DoWork(object sender, DoWorkEventArgs e)
{
PictureBox Px = new PictureBox();
Px.Image = imageList1.Images[0];
Px.Location = new Point(0, 20);
Px.BringToFront();
Px.Show();
}

بعد در رویداد کلیک کلید تائید کد زیر را وارد کرده ام


BgWorker.DoWork += new DoWorkEventHandler(BgWorker_DoWork);
BgWorker.RunWorkerAsync();

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

mostafaaa
دوشنبه 03 فروردین 1388, 09:43 صبح
سلام دوست من
یک تابع تعریف کن :

private void Test()
{
PictureBox Px = new PictureBox();
Px.Image = imageList1.Images[0];
Px.Location = new Point(0, 20);
Px.BringToFront();
this.Controls.Add(Px);
}
بعد در رویداد کلیک :

private void button1_Click(object sender, EventArgs e)
{
Test();
///ادامه کد
}

rnm123
دوشنبه 03 فروردین 1388, 10:38 صبح
دوست عزیز اول از همه سپاسگزارم که سئوالم را پاسخ دادی ولی ..
ولی سئوال من در مورد backgroundWorker بود و این مورد زمانی بکار میرود که در برنامه صحبت از یک یا چند عملیات سنگین باشد . زمانی که تابع تست فراخوانی میشود تا زمانی که عملیات بعد از آن که در سئوال مطرح کردم ( ارتباط با پایگاده داده و فراخوانی فرم ) فرم لوگین به حالت فریز میرود و اصلا نتیجه تابع تست نمایش داده نخواهد شد ( برای اطمینان شما آنرا تست کردم ) . در این حالتها باید برنامه را چند نخی کنیم و سئوال من در این مورد بود.

mahdi_farhani
دوشنبه 03 فروردین 1388, 10:47 صبح
فکر نکم برای یک عمل لاگین احتیاج به Backgroundworker باشه . (البته بستگی داره )
برای جلوگیری از فریز شدن میتونی از Application.DoEvents استفاده کنی

rnm123
دوشنبه 03 فروردین 1388, 10:52 صبح
فکر نکم برای یک عمل لاگین احتیاج به Backgroundworker باشه . (البته بستگی داره )
برای جلوگیری از فریز شدن میتونی از Application.DoEvents استفاده کنی
دوست عزیز میتون کمی بیشتر توضیح بدهی.
سئوال اصلی من این است :
وقتی کاربر کد و رمز خود را در فرم لوگین وارد کرد و کلید تائید را زد تا زمانی که برنامه به پایگاه وصل شود و درستی کد و رمز را بررسی کند و سپس فرم اصلی برنامه را باز کند کمی طول میکشد و برنامه هم کاری در این مدت جز انتظار ندارد اما میخواهم یک انیمیشنی یا یک please waitی نمایش بدهم که کاربر متوجه شود که برنامه مشغول است و قفل نکرده است.

احمد سامعی
دوشنبه 03 فروردین 1388, 13:39 عصر
دوست عزیز میتون کمی بیشتر توضیح بدهی.
سئوال اصلی من این است :
وقتی کاربر کد و رمز خود را در فرم لوگین وارد کرد و کلید تائید را زد تا زمانی که برنامه به پایگاه وصل شود و درستی کد و رمز را بررسی کند و سپس فرم اصلی برنامه را باز کند کمی طول میکشد و برنامه هم کاری در این مدت جز انتظار ندارد اما میخواهم یک انیمیشنی یا یک please waitی نمایش بدهم که کاربر متوجه شود که برنامه مشغول است و قفل نکرده است.

يك سوال اين وسط براي من مطرح شد !
مگر تو بانك شما چند هزار كاربر به عنوان ركورد ثبت شده كه كانكت شدن و تست زدن اين همه طول بكشه كه كاربر منتظر بمونه و شما عكس نشون بدي... ؟
من فكر مي كنم اصل برنامه شما و ارتباط با بانك و اين چيزات مشكل داره و اگرنه نبايد در حد ثانيه طول بكشه (من برنامه دارم كه از چند هزار ركورد سرچ مي زنه يكي دو ثانيه بيشتر طول نمي كشه تازه سيستم مشتريم پنتيوم تري)

البته ببخشيد فضولي كردم.:خجالت:

rnm123
دوشنبه 03 فروردین 1388, 17:49 عصر
يك سوال اين وسط براي من مطرح شد !
مگر تو بانك شما چند هزار كاربر به عنوان ركورد ثبت شده كه كانكت شدن و تست زدن اين همه طول بكشه كه كاربر منتظر بمونه و شما عكس نشون بدي... ؟
من فكر مي كنم اصل برنامه شما و ارتباط با بانك و اين چيزات مشكل داره و اگرنه نبايد در حد ثانيه طول بكشه (من برنامه دارم كه از چند هزار ركورد سرچ مي زنه يكي دو ثانيه بيشتر طول نمي كشه تازه سيستم مشتريم پنتيوم تري)

البته ببخشيد فضولي كردم.:خجالت:

نه خواهش میکنم .
تعداد کاربرهای من کم است مثلا یک یا دو تا. ولی خوب وقتی برنامه برای باز اول اجرا میشه تا بیاد به سرور sql وصل بشه ( از طریق دستور connection) مطمئنا کمی طول میکشه . اینطور نیست ؟ یا من اشتباه میکنم . از طرفی اگر فرم اصلی برنامه حجیم باشد بار کردن آن کمی طول میکشد . درسته ؟

احمد سامعی
دوشنبه 03 فروردین 1388, 23:17 عصر
نه خواهش میکنم .
تعداد کاربرهای من کم است مثلا یک یا دو تا. ولی خوب وقتی برنامه برای باز اول اجرا میشه تا بیاد به سرور sql وصل بشه ( از طریق دستور connection) مطمئنا کمی طول میکشه . اینطور نیست ؟ یا من اشتباه میکنم . از طرفی اگر فرم اصلی برنامه حجیم باشد بار کردن آن کمی طول میکشد . درسته ؟

البته كه Load فرم طول مي كسه اما اين ربطي به اتصال نداره(هر چند براي بار اول ممكن زمان ببره اما باز هم كم) و بايد راه ديگه اي براش پيدا كنيد
چون فرم شما كه Load و ساخته نشده، چطوري مي خواهين عكس نشون بدين

rnm123
سه شنبه 04 فروردین 1388, 00:21 صبح
البته كه Load فرم طول مي كسه اما اين ربطي به اتصال نداره(هر چند براي بار اول ممكن زمان ببره اما باز هم كم) و بايد راه ديگه اي براش پيدا كنيد
چون فرم شما كه Load و ساخته نشده، چطوري مي خواهين عكس نشون بدين
:عصبانی++::عصبانی++:
آخرشم نتونستم منظورم را به خوبی بیان کنم !
خواهش میکنم روی سئوال را یکبار دیگر با دقت بخوانید آقای ahmadahmadi . اصلا صحبت از عکس فرم نشده!
حتما با sql server کار کرده اید و حتما به محیط sql server managment هم رفته اید وقتی در صفحه ورود بعد از مشخص کردن نام سرور کلید اینتر را میزنید تا برنامه به سرور وصل شود کمی طول میکشد و در این فاصله در نوار بالای همان فرم یک نوار متحرک نارنجی رنگی شروع به حرکت میکند . بعد این فرم بسته شده وارد محیط اصلی کار میشوید. من هم همچین چیزی میخواهم:اشتباه:

Sajjad.Aghapour
سه شنبه 04 فروردین 1388, 01:04 صبح
اینطوری تست کن(چون اصرار داری با bgworker پیاده سازی کنی).این فقط یه مثاله تا بفهمی چطوری باید پیاده سازیش کنی


private delegate void myDel();
PictureBox Px;

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

private void worker_DoWork(object sender, DoWorkEventArgs e)
{
this.Invoke(new myDel(addItem));

Thread.Sleep(5000);
}

private void addItem()
{
Px = new PictureBox();
Px.Image = Image.FromFile("");
Px.Location = new Point(0, 20);
Px.BringToFront();
this.Controls.Add(Px);
}

private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
this.Controls.Remove(Px);
MessageBox.Show("finished");
}