PDA

View Full Version : خطاي System.stackowerflowexception



crying sphere
چهارشنبه 14 مهر 1389, 12:01 عصر
با سلام
من يه فرم splash برا برنامم درست كردم ولي گاهي اوقات اين خطا رو ميده :

از on error resume next هم استفاده كردم اما باز هم روي همين خط كد متوقف ميشه . فكر كنم اصلا اين ارور نباشه . كسي نظر و پيشنهادي داره بده كه چكار كنم ؟

FastCode
چهارشنبه 14 مهر 1389, 12:19 عصر
http://www.google.com/search?rlz=1C1_____enIR386IR386&sourceid=chrome&ie=UTF-8&q=DoEvents+is+evil

mehdi.mousavi
چهارشنبه 14 مهر 1389, 12:22 عصر
با سلام من يه فرم splash برا برنامم درست كردم ولي گاهي اوقات اين خطا رو ميده : از on error resume next هم استفاده كردم اما باز هم روي همين خط كد متوقف ميشه . فكر كنم اصلا اين ارور نباشه . كسي نظر و پيشنهادي داره بده كه چكار كنم ؟

سلام.
این کد شما اونقدر خطرناکه که حد نداره... من تو حالت عادی همواره توصیه میکنم از DoEvents پرهیز بشه، اما شما اونو دارید تو Event Handler مربوط به Expire شدن Timer فراخوانی میکنید و این اوضاع رو چندین مرتبه پیچیده تر میکنه.

چرا از Application.DoEvents استفاده کرده اید؟ روش صحیح استفاده از Worker Thread ها برای انجام عملیات زمان بر هستش. نه اینکه Windows رو مجبور به پردازش Message Queue کنید بدون اینکه از هویت عناصر موجود در صف پیامها اطلاعی داشته باشید.

در هر حال، در واقع این خطا نشون میده تابعی بیش از حد داره بصورت تو در تو فراخوانی میشه...

موفق باشید.

crying sphere
چهارشنبه 14 مهر 1389, 12:33 عصر
من از شما دوست گرامي خيلي ممنونم :

ببينيد من درست متوجه شدم : بايد كد برنامه رو به اين صورت تغيير بدم :




Static Overlapped As Boolean = False
If Overlapped = False Then
Overlapped = True
Me.Opacity -= 0.05
Application.DoEvents()
If Me.Opacity = 0 Then
Timer3.Enabled = False
If enter = True Then
Dim F As New frm_main
F.Show()
Me.Visible = False
enter = False
End If
End If
Overlapped = False
End If

crying sphere
چهارشنبه 14 مهر 1389, 12:55 عصر
سلام.
این کد شما اونقدر خطرناکه که حد نداره... من تو حالت عادی همواره توصیه میکنم از DoEvents پرهیز بشه، اما شما اونو دارید تو Event Handler مربوط به Expire شدن Timer فراخوانی میکنید و این اوضاع رو چندین مرتبه پیچیده تر میکنه.

چرا از Application.DoEvents استفاده کرده اید؟ روش صحیح استفاده از Worker Thread ها برای انجام عملیات زمان بر هستش. نه اینکه Windows رو مجبور به پردازش Message Queue کنید بدون اینکه از هویت عناصر موجود در صف پیامها اطلاعی داشته باشید.


باورتون ميشه من تازه فهميدمكه اين كد خطرناكه ؟!! .
من در رابطه با Worker Thread ها خيلي جستجو كردم اما چيز راضي كننده اي پيدا نكردم و به نتيجه دلخواه نرسيدم . به خاطر همين هم چون اين قطعه كد رو از قبل سراغ داشتم همون رو گذاشتم تو برنامم .

ميشه يه خلاصه مفيد از Worker Thread ها با يكم كد بگين تا من ياد بگيرم ؟ ممنون

mehdi.mousavi
چهارشنبه 14 مهر 1389, 14:18 عصر
ميشه يه خلاصه مفيد از Worker Thread ها با يكم كد بگين تا من ياد بگيرم ؟ ممنون

سلام.
برای اینکه یک کار زمان بر رو در برنامه انجام بدید، به نحوی که Main Thread برنامه از کار نیفته (و در نتیجه برنامه Responsive باقی بمونه)، شما میتونید انجام عملیات مزبور رو به Thread دیگه ای واگذار کنید و با Notification هایی که بین اون Thread و UI Thread خودتون رد و بدل می کنید، UI رو به روز نگهدارید و (در صورت تمایل) کاربر رو از روند اون فعالیت مطلع کنید.

در .NET به روشهای متفاوت می تونید Thread ایجاد کنید. یکی از ساده ترین این روشها، استفاده از کلاس BackgroundWorker هستش. من قبلا در این تاپیک (http://barnamenevis.org/forum/showthread.php?t=197197) نحوه استفاده از اونو توضیح داده ام. روش دیگه استفاده از ThreadPool (http://msdn.microsoft.com/en-us/library/3dasc8as%28VS.80%29.aspx) هستش. استفاده از کلاس Thread (http://msdn.microsoft.com/en-us/library/7a2f3ay4%28v=VS.80%29.aspx) یکی دیگه از این روشهاست...

موفق باشید.

پاورقی: کد شما ممکنه با اضافه کردن چند تا Flag بنظر درست بشه، اما هرگز تضمینی وجود نداره که همواره درست کار کنه، چون DoEvents باعث پردازش پیامهای موجود در صف، در لحظه فراخوانی تابع میشه. برای اینکه ایرادهای دیگه ای در برنامه پیش نیاد، بهتره که مساله رو یکبار از بیخ و بن حل کنید (بکمک Thread ها) و دیگه از DoEvents هم استفاده نکنید.