PDA

View Full Version : سوال: مشکل در متوقف کردن Thread



ali190
جمعه 04 فروردین 1391, 13:33 عصر
باسلام و عرض خسته نباشید
من در برنامه ام یه Thread به صورت زیر تعریف کردم

Dim t As New Threading.Thread(AddressOf CopyFile)

Public Sub CopyFile()
اجرای عملیات کپی گرفتن از فایل
t.Abort()

End Sub
اینم کد استارت Thread:

Control.CheckForIllegalCrossThreadCalls = False
t.Start()
همانطور که ملاحظه میکنید در در تابع Copyfile تعریف کردم بعد از انجام عملیات ، Thread بسته بشه
ولی وقتی بعد از انجام عملیات کپی دوباره میخوام یه فایل دیگه رو کپی کنم و thread رو استارت میکنم خطای زیر رو دریافت میکنم:
Thread is running or terminated
ممنون میشم راهنماییم کنید
یاعلی

فرید نجفلو
جمعه 04 فروردین 1391, 14:56 عصر
شما تو کد استارت t رو دوباره مقدار دهی کنید ببینید حل میشه :


Control.CheckForIllegalCrossThreadCalls = False
t =New Threading.Thread(AddressOf CopyFile)
t.Start()

ali190
جمعه 04 فروردین 1391, 15:31 عصر
ممنونم
بله مشکل حل شد
میشه یه توضیح کوچیک بدید که مشکل از چی بود؟
راستی چند سئوال دیگه هم داشتم (نمیدونم به این تایپیک ربط داره یا باید در جای دیگه مطرح کنم):
1- آیا ما در استفاده از ترید ها محدودیتی داریم؟
2-حداکثر چند تا ترید باید در برنامه استفاده بشه و این مسئله از چه پارامترهایی نشئت میگیره؟
3-فرق بین Backgroundworker با ترید در چیه؟ آیا Backgroundworker هم زمان مربوط به یه عملیات رو کم میکنه؟
ممنونم
یاعلی

فرید نجفلو
جمعه 04 فروردین 1391, 16:04 عصر
میشه یه توضیح کوچیک بدید که مشکل از چی بود؟

وقتی شما Abort رو صدا می زنید در واقع t رو متوقف می کنید و رفرنس اون ، به تابع هم از بین می ره که باید دوباره مقدار دهی بشه


- آیا ما در استفاده از ترید ها محدودیتی داریم؟


میشه گفت از نظر تئوری خیر ولی شما نیاز به این همه نخ نخواهید داشت!


- آیا ما در استفاده از ترید ها محدودیتی داریم؟
2-حداکثر چند تا ترید باید در برنامه استفاده بشه و این مسئله از چه پارامترهایی نشئت میگیره؟

شما محدویت استفاده ندارید ولی نباید بیجا استفاده بشه چند نخی یه شمشیر دولبه ست که ممکنه به جای افزایش کارایی موجب کهش کارایی بشه حتی در جاهایی که بیشتر از یک CPU وجود نداره ممکنه تاثیری بر کارایی نداشته باشه و فقط برای اهداف دیگه مثل جلو کیری از عدم پاسخگویی فرم و یا در کارهای طولانی جلوگیری از متوقف شدن نمایش UI استتفاده بشه
ولی نمیشه گفت باید از چند نخ استفاده بشه ممکنه یک برنامه با همون یک نخ خودش خوب کار کنه ولی برنامه دیگه نیاز به دو ، سه ، چهار و بیشتر نخ داشته باشه
ولی تا حد امکان باید از ازدیاد نخ ها جلو گیری بشه و نحوه کارشون بدقت مدیریت تا با مشکلات همگام سازی و Dead Lock (بن بست) ها مواجه نشید که خیلی خطرناک هستن

پس اگه نیاز باشه و بتونید خوب کنترل کنید نخ ها بسیار مفید خواهند بود



3-فرق بین Backgroundworker با ترید در چیه؟ آیا Backgroundworker هم زمان مربوط به یه عملیات رو کم میکنه؟

این همون Threading به صورت شئی گرا و مدیریت شده است که اگه بتونی ازش استفاده کنی راحت تر و امن تر و قوی تر (از نظر امکانات) خواهد بود
ولی نکاتی هست که باید توجه کنی واسه این کار وقتی یکی از اینا رو به فرم اضافه کردی انتخاب و روش F1 بزن
یک نمونه هم گذاشتن(با اینکه فکر کنم بری شروع کمی واست پیچیده باشه!)

ali190
جمعه 04 فروردین 1391, 16:16 عصر
از توضیحاتتون ممنونم
یعنی همه کارهایی که میشه با ترید انجام داد رو میشه با Backgroundworker پیاده سازی کرد؟
آیا از طریق اونت ProgressChanged مربوط به Backgroundworker میشه میزان پیشرفت عملیات رو محاسبه نمود؟
میشه یه مثال بزنید مثلاً Backgroundworker در کجاها استفاده میشه؟
راستی منظور شما از نخ همون عملیات هست؟
چند نخ هم یعنی همزمان مودن چند عملیات مختلف؟
ممنونم
یاعلی

فرید نجفلو
جمعه 04 فروردین 1391, 16:42 عصر
یعنی همه کارهایی که میشه با ترید انجام داد رو میشه با Backgroundworker پیاده سازی کرد؟
بله میشه و اگه اصولش رو یاد بگیرید راحتر هم هست


آیا از طریق اونت ProgressChanged مربوط به Backgroundworker میشه میزان پیشرفت عملیات رو محاسبه نمود؟
بله
ولی این نکته رو باید مورد توجه قرار بدید که Backgroundworker خودش میزان پیشرفت رو محاسبه نمی کنه(و نمی تونه)
در واقع شما هر جایی که کارتون رو انجام می دید با متد ReportProgress میزان پیشرفت کار رو به اون ، و اون هم به نوبه خود به UI اطلاع میده
این کار واسه این نکته مهمه که شما وقتی داری یه نخ جدا رو میفرستی اصولا اون نباید با UI(یا همون فرم) کاری داشته باشه! پس این متد و چند تای دیگه واسط بین برنامه اجرایی توسط نخ و UI خواهند بود


میشه یه مثال بزنید مثلاً Backgroundworker در کجاها استفاده میشه؟
مثال این تاپیک بنده ست که با Threading پیاده کردم که می شد با Backgroundworker هم بنویسم!
س.رس:ProgressBar(درصد پیشرفت کار) در پشتیبان گیری SQl Server بدون استفاده از SMO (http://barnamenevis.org/showthread.php?331999-س.رس-ProgressBar(درصد-پیشرفت-کار)-در-پشتیبان-گیری-SQl-Server-بدون-استفاده-از-SMO)

یا این تاپیکم که ممکنه شما تا ذخیره شدن فایل های حجیم به کاربر اجازه بدید به کاهای دیگه بپردازه:

سورس:ذخیره و بازیابی فایل در SQL Server و Access با درصد پیشرفت(دانلود کنید!) (http://barnamenevis.org/showthread.php?333391-سورس-ذخیره-و-بازیابی-فایل-در-SQL-Server-و-Access-با-درصد-پیشرفت(دانلود-کنید!))

یا این تاپیک که در حال حاظر داره روش بحث میشه:

دیر باز شدن صفحه کریستال در برنامه (در اولین اتصال) (http://barnamenevis.org/showthread.php?333441-دیر-باز-شدن-صفحه-کریستال-در-برنامه-(در-اولین-اتصال))



راستی منظور شما از نخ همون عملیات هست؟
نخ معادل فارسی Thread و چند نخی معادل MultiThreading و به صورت کلی یعنی انجام همزمان و موازی عملیات هاست

اینم ترجمه Thread در بابیلون:


پيچ کردن ،دنده دار کردن ،مارپيچ ،دنده پيچ ،سيم ،ريسمان ،قيطان ،رزوه ،شيارداخل پيچ ومهره ،شيار،برجستگى ،رگه ،نخ کردن ،بند کشيدن ،نخ کشيدن به ،موجى کردن ،داراى خطوط برجسته کردن ،حديده وقلاويز کردن ،رشته رشته شدن ،مثل نخ باريک شدن
علوم مهندسى : نخ يا قيطان
عمران : نخ
معمارى : ريسمان
علوم هوايى : دندانه

که بخش مهندسی مربوط به ماست!

ali190
جمعه 04 فروردین 1391, 17:31 عصر
یعنی امکانش هست با استفاده از Backgroundworker یک عملیات رو مثل Thraed Pause یا Resume نمود؟

فرید نجفلو
جمعه 04 فروردین 1391, 17:44 عصر
یعنی امکانش هست با استفاده از Backgroundworker یک عملیات رو مثل Thraed Pause یا Resume نمود؟
تا اونجایی که من اطلاع دارم متاسفانه این امکانات رو پشتیبانی نمی کنه!