PDA

View Full Version : سوال: مشكل عجيب در crash کردن بعد از چند روز برنامه



ali1979
دوشنبه 10 فروردین 1388, 22:41 عصر
با سلام
بعد از نوشتن يك برنامه با vc6 مشكلي برايم پيش آمده كه دليل آن را نمي دانم
اين برنامه با يك سخت افزار از طريق پورت سريال در ارتباط است و آْن را كنترل مي كند.
در اين برنامه همزمان 3 thread فعاليت ميكنند و برنامه بايد دايم باز باشد.
مشكل: بعد از چند روز كه برنامه باز است user interface برنامه crash ميكند يعني منوها سياه ميشوندو رنگ ها به هم ميريزد در صورتي كه برنامه كار اصلي خود را انجام ميدهد و hang نميكند. بايد آن را ببندم و دوباره باز كنم.
ميخواستم تقاضا كنم اگر كسي تجربه اي در اين زمينه دارد به من كمك كند.
با تشكر

Nima_NF
سه شنبه 11 فروردین 1388, 01:56 صبح
اکثر خطاهای این چنینی که بعد از چند ساعت یا چند روز ایجاد می شوند معمولا به خاطر استفاده از یک متغیر هست که به انتهای بازه خود می رسد و یکدفعه با مقدار نامشخص خطایی ایجاد می کند.
مثلا وقتی از یک متغیر برای محاسبه ساعت استفاده می کنید و هر صدم ثانیه یا هر ثانیه یک واحد به آن اضافه می کنید، اگر ازنوع short باشد ،و پس از چند روز به عدد 2 به توان 16 برسد، آنوقت خطا می دهد. چون شما قطعه کدی برای کنترل انتهای بازه ننوشته اید، یعنی باید بنویسید:



if ( myCounter > SHRT_MAX )
myCounter = 0;


همین طور برای تمامی متغیر های دیگر که نقش counter در کدهای شما را دارند. اگر این کنترل ها رعایت نشود چنین مشکلاتی به وجود می آید. یعنی خطای پیش بینی نشده پیش می آید.

و البته ده ها مورد ممکن دیگر.

ali1979
شنبه 15 فروردین 1388, 22:53 عصر
با سلام مجدد
من حدود خطا را پيدا كردم اما دليل اصلي را خير
برنامه علاوه بر واسط كاربر از دو thread ديگر استفاده ميكند. اين دو thread براي اطلاع رساني به كاربر اطلاعات مورد نياز را در يك بافر قرار داده و توسط PostMessage به ديالوگ مورد نظر براي استفاده ونمايش از اطلاعات خبر ميدهند. سپس ديالوگ اطلاعات را گرفته و تغييرات لازم را در آن ميدهد و توسط تابع SetWindowText در دو كنترل CEdit (يا Static) آنها را نمايش ميدهد. اين كار ممكن است هر 10 ثانيه يك بار تكرار شود. طول رشته CString كه به SetWindowText پاس داده ميشود هيچوقت بيش از 2000 كاراكتر نميشود. هنگامي كه تابع
SetWindowText را از كد حذف ميكنم برنامه به خوبي به كار خود ادامه ميدهد اما وقتي دوباره آن را به كد اضافه ميكنم بعد از مدتي كل user interface به هم ميريزد منوها سياه ميشود و دكمه ها محو ميشوند گاهي اوقات taskbar ويندوز نيز به هم ميريزد در حالي كه برنامه كار اصلي خود را انجام ميدهد و هيچ خطايي نميدهد. تا آنجا كه من چك كردم تمام متغيرهاي مورد استفاده safe هستند.
همچنين از روش UpdateData نيز تست كردم مشكل وجود دارد.
لطفا اگر تجربه اي در اين مورد داريد و يا راه حل جايگزيني براي نمايش اطلاعات داريد
راهنمايي كنيد.
با تشكر

ali1979
جمعه 28 فروردین 1388, 14:43 عصر
مشكل كشف گرديد
براي تغيير رنگ فرم در تابع onCtlColor از تابع CreateSolidBrush استفاده كرده بودم بدون اين كه بعد از آن از DeleteObject براي پاك كردن brush ساخته شده استفاده كنم. چون دقت نكرده بودم كه onCtlColor به تعداد زياد اجرا ميشود. اين brush هاي زياد و بدون استفاده باعث آنچه مي شده كه در بالا گفتم.:لبخند:
با تشكر از Nima_NF