PDA

View Full Version : استفاده از thread , progress bar



b.mahsa
یک شنبه 21 شهریور 1389, 12:08 عصر
با سلام.
من يه form دارم كه توش يه پردازش خيلي سنگين انجام ميشه .
ميخوام در زماني كه پردازش داره انجام ميشه براي كاربر يه progress bar بزارم كه نشان دهنده ي waiting باشه.
يه form درست كردم كه شامل يك progress bar هست . تو form_load كد زير رو نوشتم.





Private Sub Form_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
RadWaitingBar1.StartWaiting()
End Sub



و با thread زماني كه ميخوام waiting رو به كاربر نشان بدم . form.show رو فراخواني ميكنم.
متاسفانه تو برنامم error افتاده. (عكس error رو ضميمه ميكنم.)
عجيب اينجاست كه زمان debug اين error رو ندارم . و اين error فقط تو exe منه.
اين پست (http://barnamenevis.org/forum/showthread.php?t=75971) آقاي موسوي رو ديدم. ولي چيزي ازش متوجه نشدم.:ناراحت:
ممنون ميشم كه راهنماييم كنين. يا اگر روش ديگه اي رو مي شناسيد معرفي كنين . ممنون

MAHDIACTION
یک شنبه 21 شهریور 1389, 22:05 عصر
سلام دوست عزيز

كد پايين رو نگاه كنيد ،‌بايد مشكل شمارو حل كنه.
اگه سوالي بود در خدمتم.

b.mahsa
یک شنبه 21 شهریور 1389, 22:21 عصر
ممنون از پاسختون.
من vs 2005 ندارم و ظاهرا فایل شما 2005 هست.
ممنون میشم راه حلتون رو توضیح بدید. یا کدش رو اینجا بزارید.
--------------------
دوستان کسی از این error چیزی نمیدونه؟ این چه Error ی که زمان compile نیست و تو exe پیدا میشه ؟؟؟؟:ناراحت:

MAHDIACTION
دوشنبه 22 شهریور 1389, 14:49 عصر
سلام

قبل از همه چيز دقت كنيد كه انتهاي Error نوشته كه :Thread Was being Aborted
يعني شما بايد Thread خودتون رو بايد Abort كنيد با فراخواني متد abort‌از شي ساخته شده . اين مشكل حل مي شه.

فايل Form1.vb با NotPad باز كنيد كد زير رو مي تونيد .داشته باشيد.


Imports System.Threading
PublicClass Form1
Dim objThread As Thread
PrivateSub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Try
objThread = New Thread(AddressOf ConvertExcelToSql)
objThread.Start()
CheckForIllegalCrossThreadCalls = False

Catch ex As Exception
EndTry
EndSub
PrivateSub ConvertExcelToSql()
Dim intcounter AsInteger
Button2.Enabled = True
Button1.Enabled = False
ProgressBar1.Value = 0
ProgressBar1.Maximum = 1000000
For intcounter = 1 To 1000000
ProgressBar1.Value = intcounter
Next
ProgressBar1.Value = 0
Button2.Enabled = False
Button1.Enabled = True
EndSub
PrivateSub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
ProgressBar1.Value = 0
Button2.Enabled = False
Button1.Enabled = True
objThread.Abort()
EndSub
PrivateSub Form1_FormClosing(ByVal sender AsObject, ByVal e As System.Windows.Forms.FormClosingEventArgs) HandlesMe.FormClosing
objThread.Abort()
EndSub
EndClass

من يقين دارم كه مشكل شما ، ازبين نبردن Thread هست . شما با فراخواني متد abort از شي ساخته شده از Thread مي تونيد ،Thread رو از بين ببريد.

b.mahsa
دوشنبه 22 شهریور 1389, 15:02 عصر
ممنون از توجهتون . من از متد abort استفاده میکنم.
نه مشکل نباید به این سادگی باشه.:متفکر:
چون زمان debug هیچ مشکلی وجود نداره.
تو google search کردم. نوشتته بود مشکل از یک ویروسه.... اما به نظرم منطقی نیست...:ناراحت:
کسی راه دیگه ای نمیدونه؟

MAHDIACTION
دوشنبه 22 شهریور 1389, 15:11 عصر
شما فايل Exe برنامه اي كه براتون گذاشتم رو تست كنيد يا يه پروژه با كد هايي كه نوشتم بسازيد.اين برنامه رو سيستم من مشكل نداره اگه مشكل شما حل شد كه هيچ و گرنه بايد يا ويندوز عوض كنيد يا Vs خودتون رو .

b.mahsa
دوشنبه 22 شهریور 1389, 15:24 عصر
رو سیستم های دیگه هم تست کردم. همین مشکل هست. و البته مشکل همیشگی نیست. ممکنه گاهی رخ بده.
اینکه exe شما این مشکل رو نداره ...:متفکر: شاید به خاطر سنگینی پردازش من باشه. چون پردازش من حدود 2 دقیقه طول میکشه.

MAHDIACTION
دوشنبه 22 شهریور 1389, 15:42 عصر
مشكل شما مي تونه با ديدن كد حل بشه.
چون با اين تفاصيل مشكل از ويروس نيست ، از Thread كه هم نيست ،از ويندوز هم كه نيست، پس امكان داره از خود كدها باشه.

b.mahsa
دوشنبه 22 شهریور 1389, 15:48 عصر
نه از کد ها نیست چون با برداشتن thread هام . این error هم بر طرف میشه.
فکر میکنم تو نحوه ی استفاده از thread یک نکته رو در نظر نمی گیرم.
آقای موسوی تو اون تاپیکی که تو پست اول بهش اشاره کردم. یه توضیحاتی دادن که من متاسفانه متوجه نشدم.

نمی دونم راه دیگه ای جز استفاده از thread به این شکل نیست؟

کسی نمی دونه مشکل از کجاست؟:ناراحت:
به جز thread از چه چیز دیگه ای میشه استفاده کرد؟
یا ایراد من تو روش استفاده از thread چیه؟

mahdi1373
سه شنبه 30 شهریور 1389, 04:39 صبح
چرا، چند تا روش هست.
یکی اش application.doevent هست. این کد رو باید توی درونیترین حلقه برنامه تون با اونجایی که مرتب اجرا میشه قرار بدین. در این صورت نیگه برنامه تون دیگه هنگ نمیکنه.
توجه کنید که این کد باید مرتبا اجرا بشه.

b.mahsa
سه شنبه 30 شهریور 1389, 16:34 عصر
ممنون از پاسختون.
application.doevent .background worker هست. یعنی Form من freez نمیشه و در هنگام اجرای پردازشم. کاربر میتونه با فرم و دکمه ها کار کنه.(در هنگام پردازش باید فرم من فریز بشه که کاربر نتونه کار کنه.)
راه دیگه ای نیست؟
من از thread درست استفاده میکنم ؟

Mani_rf
سه شنبه 30 شهریور 1389, 17:29 عصر
این از اون دسته مشکلاتیه که باید کد تریس بشه تا بشه مشکلش را حل کرد و با توضیح دادن شما فقط و فقط از مسئاله دور میشیم.

1- اگر با استفاده از Application.DoEvents مشکل حل میشود و مشکل شما فقط فعال ماندن فرم و دسترسی کاربر به آن است می توانی در ابتدای انجام عملیات فرم را Disable و در انتهای عملیات آن را Enable کنی.

2- اگر مطلقا میخواهی از روش خودت جلو بروی سورس قسمتی که این مشکل را دارد را آپلود کن (به صورتی که قابل اجرا کردن و تریس کردن باشد) تا از نزدیک مشکل را بررسی کنیم.

به نظرم می آید که مشکل از جای دیگری باشد و اصلا به آنجا که شما فکر میکنید ارتباطی نداشته باشد...

b.mahsa
سه شنبه 30 شهریور 1389, 18:02 عصر
ممنون.
با disable کردن نمیشه . اگر یک فرم رو disable کنم با بقیه میتونه کار کنه.
وقتی thread ها رو بر میدارم اون error هم رفع میشه؟ فکر میکنم از thread باشه. یا از سنگینی پردازش.:متفکر: ( thread به زمان پردازش مربوط نمیشه؟)
امکان upload ندارم . بانکم خیلی سنگینه.

توی گوگل search کردم نوشته بود از یه viruse ... ولی منطقی نیست. virus به threadچه ربطی داره؟

ashkan209
سه شنبه 30 شهریور 1389, 19:04 عصر
امید که این سمپل مشکلتون رو حل کنه.
چون توی این سمپل کد فرضی رو حلقه for در نظر گرفته ام بنابراین از Continues progressbar استفاده کردم ولی قطعا کد شما اجرای حلقه نیست و مجموعه ای از چندین خط هست که قراره اجرا بشه ، بنابراین از Marquee progressbar استفاده کنید

mehdi.mousavi
جمعه 09 مهر 1389, 00:08 صبح
سلام.
حقیقتش من تازه پیام خصوصی شما رو خوندم که در اون به این تاپیک اشاره کرده اید. من توضیح کاملی در مورد BackgroundWorker در این تاپیک (http://barnamenevis.org/forum/showthread.php?t=197197) داده ام. با استفاده از این Class می تونید به هدفتون برسید.

در مورد استفاده از Application.DoEvents و خطرات مربوط به اون نیز بارها توضیح داده ام. لطفا در پستهای من دنبال DoEvents بگردید و مطالبی که در این مورد نوشته ام رو بخونید تا متوجه خطرات استفاده از این متود بشید.

موفق باشید.