PDA

View Full Version : سوال: هر کاری که می کنم زمان پردازش کردن برنامه هام هیچ کاری روی فرم نمیتونم انجام بدم



armin001
یک شنبه 25 تیر 1391, 18:59 عصر
سلام
زمانی که برنامه شروع به پردازش میکنه روی هیچ یک از کنترل های روی فرم هیچ کاری نمیتونم بکنمکنید وقتی فرم کلیک میکنم not responding میشه. این مشکل رو روی همه ی برنامه هایی که نوشتم دارم
لطفا راهنماییم کنید باتشکر

ahmadreza517
یک شنبه 25 تیر 1391, 19:56 عصر
به نام تنها برنامه نویس هستی
سلام ,

از Thread ها استفاده کنید.در صورت اشنایی نداشتن به مبحث Threading می تونید از توضیحات msdn شروع کنید.

NitroPlus
یک شنبه 25 تیر 1391, 19:56 عصر
خب عزیز سوالت گنگه!:گیج: یه نمونه بزار تا راهنماییت کنم
ولی احتمالاً کدی رو (با توجه به گفتت که: وقتی فرم کلیک میکنم not responding میشه) تو قسمت فرم لود یا اکتیو یا مشابه گذاشتی که CPU رو بشدت درگیر می کنه و این پیغام رو میده!
در هر حال یه نمونه بزاری ممنون میشم

armin001
یک شنبه 25 تیر 1391, 20:11 عصر
خب عزیز سوالت گنگه!:گیج: یه نمونه بزار تا راهنماییت کنم
ولی احتمالاً کدی رو (با توجه به گفتت که: وقتی فرم کلیک میکنم not responding میشه) تو قسمت فرم لود یا اکتیو یا مشابه گذاشتی که CPU رو بشدت درگیر می کنه و این پیغام رو میده!
در هر حال یه نمونه بزاری ممنون میشم

مثلا یه تاپیک دیگه که در باره کدگذاری کردن متن بصورت دودویی گذاشتم اگه یه متن طولانی درحدی که 1 یا 2 دقیقه طول بکشه (که بشه تست کرد) زمانی که داره برای کد گذاری کردن پردازش میکنه اگه روی کنزل های دیگه مثل button ها کلیک کنی هیچ اتفاقی نمی افته حتی دکمه ها فشرده هم نمی شه حالا اگر یه دگمه برای کنسل کردن عملیات بگذارم وقتی روش کلیک میشه هیچ اتفاقی نمیافته
اگه بازم گنگه ببخشید کلا من عادتمه سوالاتم همه گنگن:خجالت:

the king
یک شنبه 25 تیر 1391, 20:34 عصر
سلام
زمانی که برنامه شروع به پردازش میکنه روی هیچ یک از کنترل های روی فرم هیچ کاری نمیتونم بکنمکنید وقتی فرم کلیک میکنم not responding میشه. این مشکل رو روی همه ی برنامه هایی که نوشتم دارم
لطفا راهنماییم کنید باتشکر

کار هایی که با اینترفیس برنامه تون در ارتباطه، مثل نمایش های گرافیکی، پردازش کلیک کردن روی کنترل ها و مقادیر داخل TextBox ها و ... رو باید
همون Thread اصلی انجام بده که فرم تون رو اداره می کنه. برای اونها کار خاصی انجام نمی دهید، همون کد عادی ای که می نویسید با Thread
اصلی اداره میشه. اما سایر عملیاتی که وقت گیر هستند رو به یک Thread جداگانه بسپارید. ساده ترین راه اش هم اینه که از کمپوننت
BackgroundWorker استفاده کنید که روی فرم می اندازید و وقتی انجام کاری رو بهش بسپارید بصورت خودکار Thread جداگانه می سازه و
قابلیت Cancel کردن عملیات یا گزارش کردن پیشرفت پردازش رو داره.

نکته ها :
1) وقتی Thread جدیدی می سازید فراموش نکنید که این Thread معمولا به اجزایی که به فرم و مباحث Visual مربوطه دسترسی مستقیم نداره،
پس فرضا سعی نکنید که مستقیما باهاش متن یک TextBox رو عوض کنید. انجام اینکار باید توسط Thread اصلی انجام بشه که مسئول
اداره کردن فرم و اجزاء داخلشه. سپردن انجام اینجور موارد به Thread اصلی دشوار نیست.

2) Thread ها مستقل از هم هستند، اگر می خواهید مقدار متغیری بینشون مشترک باشه از عبارت کلیدی Shared در تعریف متغیر استفاده کنید
تا همه Thread ها به همون مقدار واحد دسترسی داشته باشند.

3) قابلیت های BackgroundWorker برای اکثر کاربرد ها کفایت می کنه، تا حد امکان خودتون رو با نوشتن های کد های اضافی برای ساختن Thread
بصورت مستقیم درگیر نکنید، مگر در موارد خیلی خاص که به ندرت لازم میشه.

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

89757

مهرداد صفا
دوشنبه 26 تیر 1391, 21:46 عصر
به نام خدا و با سلام
در حالت عادی رویدادها و پیام های مربوط به یک فرم به ترتیب پردازش شده و بعد از اتمام کامل یک متود روداد بعد پردازش میشود. شما میتوانید در زمانی که پردازش مربوط به یک رویداد طولانی می شود و یا در حلقه های طولانی از متود DoEvents استفاده کنید.
این متود عضو کلاس System.Windows.Forms.Application میباشد که شی My.Application یک object از این کلاس میباشد. شما فقط میتوانید این متود را در WindowsApplications استفاده کنید.
در این مثال در متود form_load یک حلقه طولانی وجود دارد که برنامه علاوه بر پردازش آن رویداد KeyDown را هم اجرا میکند و با هر کلید یکی به عنوان فرم اضافه میکند.


'in the name of god
Public Class Form1

Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
Me.Text += 1
End Sub

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Me.Text = 1
Me.Show()
Me.Select()
For i As Long = 1 To 10000000
My.Application.DoEvents()
Next
System.Media.SystemSounds.Beep.Play()
Me.BackColor = Color.Black
End Sub
End Class



سلام
زمانی که برنامه شروع به پردازش میکنه روی هیچ یک از کنترل های روی فرم هیچ کاری نمیتونم بکنمکنید وقتی فرم کلیک میکنم not responding میشه. این مشکل رو روی همه ی برنامه هایی که نوشتم دارم
لطفا راهنماییم کنید باتشکر

xminxmin
سه شنبه 27 تیر 1391, 11:47 صبح
سلام
زمانی که برنامه شروع به پردازش میکنه روی هیچ یک از کنترل های روی فرم هیچ کاری نمیتونم بکنمکنید وقتی فرم کلیک میکنم not responding میشه. این مشکل رو روی همه ی برنامه هایی که نوشتم دارم
لطفا راهنماییم کنید باتشکر

سلام دوست من.
نیازی به این همه بحث تخصصی نداره بابا
کافیه درون کد برنامه (مثلا در بدنه For یا تایمر و...) که پردازش مدام داره اونجا انجام میشه این یک خط کد رو بزاری

Application.DoEvents()

مثال:


For i As Integer= 0 To 10000
Text1.Text="Number= " & i.ToString
Application.DoEvents()
Next i

armin001
سه شنبه 27 تیر 1391, 15:24 عصر
خیلی ممنون مشکلم حل شد همه راه هایی رو که گفتین تست کردم جواب داد.

amirzandi
چهارشنبه 18 مرداد 1391, 21:25 عصر
آرمین جان ، این Application.DoEvents رو خود Microsoft زیاد سفارش نمی کنه ، بهترین راهش از Thread و Delegate ها هست.

armin001
چهارشنبه 18 مرداد 1391, 21:33 عصر
آرمین جان ، این Application.DoEvents رو خود Microsoft زیاد سفارش نمی کنه ، بهترین راهش از Thread و Delegate ها هست.

امیرجان من از BackgroundWorker استفاده کردم که مشکلم حل شد (پاسخ 5)
اگه درمورد thread ها یکم بهم اطلاعات بدی واقا ممنون میشم چون هیچی ازش نمیدونم

amirzandi
چهارشنبه 18 مرداد 1391, 21:36 عصر
بسیار عالی عزیز جان ، شما استاد مایی.

مخلصیم

armin001
چهارشنبه 18 مرداد 1391, 21:58 عصر
شرمنده میخواستم اگه ممکنه در مورد thread ها بهم اطلاعات بدی

amirzandi
پنج شنبه 19 مرداد 1391, 07:17 صبح
چه اطلاعاتی می خوای؟ اینجا همه مسائلش هست ولی راستش رو بخوای من با خوندن مسائل اینجا خیلی چیزی نفهمیدم نمیدونم چرا....

ولی هر کمکی بتونم بهت می کنم.

مخلصیم