PDA

View Full Version : مشکل در هنگام خروج از برنامه



soroush_vs
شنبه 25 فروردین 1386, 08:57 صبح
با سلام خدمت دوستان و اساتید گرامی سایت زیبای برنامه نویس
من یک مشکل بحرانی در برنامه خودم دارم.
مشکل این هست که هنگام خروج از برنامه برنامه بطور کامل خارج نمیشه و همچنان در حافظه باقی میمونه.در ضمن CPU Usage برای پروسس برنامه هم تقریبا مقدارش میشه 99 یا 100 درصد یعنی فاجعه.تا به حال با بسیاری از دوستانم این مشکل رو در میان گذاشتم اما به راه حل نرسیدم
بعضی گفتند که باید برنامه رو دیباگ کنی اما با دیباگ کردن هیچ چیز به دست نمییاد حتی در صدد بر آمدیم تا پنجره ای را که این کد را تولید میکند ناسای کنیم اما نشد . یعنی چیزی که من به شخصه فکر میکنم این هست که این وضعیت هنگامی برای برنامه ایجاد میشه که تمام فرم ها و اشیاء از حافظه Free شدن و دیگه نمیشه به دیباگ کردن تکیه کرد.اما من با دیباگ کردن یه نکته رو متوجه شدم و اون اینه که در دیباگ هنگام برز مشکل در پنجره CPU از دیباگ برنامه روی خطی خاص Stop میشود عکس مربوطه رو هم قرار میدم.
هر گونه نظری دارید لطفا عنایت کنید.
با تشکر.

Ehsani2006
شنبه 25 فروردین 1386, 09:18 صبح
برای خروج کامل از برنامه به جای استفاده از دستور Close باید تو OnClose فرمت از دستور :


Application.Terminate

arshia_
شنبه 25 فروردین 1386, 13:40 عصر
ممکنه شما در برنامه ار چند فرم استفاده کردید
اگر در فرم اصلی برنامه فرمان close;‌بنویسی و هیچ فرمی فعال نباشه برنامه بدرستی تموم می شه
در غیر این صورت از فرمان Application.Terminate رو که آقای احسانی گفت استفاده کن براحتی اعمال می شه

E_Zabihi
شنبه 25 فروردین 1386, 14:18 عصر
البته اگر چنین Error می گیری بهتری ریسورهایی رو که استفاده کردی حتما release کنی با استفاده از application.terminate چند ثانیه طول می گشه تا همه ریسورس های سرگردان آزاد بشند ...

soroush_vs
شنبه 25 فروردین 1386, 14:26 عصر
ممنون از جوابتون قبلا این مورد رو امتحان کرده بودم اما جواب نگرفتم
اما با پست شما یه ایده به ذهنم رسید چون من برنامه رو در رویداد OnCloseQuery میبستم یعنی تحت یک شرایط برنامه بسته میشد و این شرایط رو با CanClose کنترل میکردم.با یک تغییرات در روند مشکلم به ظاهر حل شده.
باز هم تشکر به ویژه از آقای کوشا و آقای ذوالقدری که قبلا برای این مورد وقت گذاشته بودند و راهنمایی کردند.

soroush_vs
شنبه 25 فروردین 1386, 14:28 عصر
با استفاده از Application.Terminate در Event OnCloseQuery به نظر تا اینجا مشکلم حل شده.
تشکر از همه دوستان

SYNDROME
شنبه 25 فروردین 1386, 15:17 عصر
با سلام
از دستور Halt(0) استفاده کن.
جواب می ده.

soroush_vs
شنبه 25 فروردین 1386, 19:45 عصر
نه هنوز این مشکل وجود داره

SYNDROME
شنبه 25 فروردین 1386, 20:27 عصر
با سلام
دستوری که در بالا گفتم برنامه را کامل می بندد.
مگر اینکه به طور مثال بعد از بستن فرم از آن فرم چیزی را استفاد ه کنی.
حالا اگر سورس برنامه کوچیکه اون را قرار بده تا ببینیم مشکل در کجاست یا حداقل پیغام خطا را بنویس و خط را هم نمایش بده.

ealvandi
شنبه 25 فروردین 1386, 20:49 عصر
سلام

آقا شما فرم اصلی برنامه رو close کن .

عجیبه دستور halt; همیشه درست عمل میکنه

دستور halt رو برای فرم اصلی هم امتحان کن.



انشاالله که موفق بشی.

soroush_vs
شنبه 25 فروردین 1386, 21:03 عصر
آقا بعضی مواقع اصلا خطایی تولید نمیشه فقط همون طور که قبلا گفتم CPU Usage مربوط به پروسس برنامه بعد از اقدام به خروج به شدت افزایش پیدا میکنه
بعضی مواقع هم Access Violation میده

SYNDROME
شنبه 25 فروردین 1386, 22:37 عصر
با سلام

آقا بعضی مواقع اصلا خطایی تولید نمیشه فقط همون طور که قبلا گفتم CPU Usage مربوط به پروسس برنامه بعد از اقدام به خروج به شدت افزایش پیدا میکنه
بعضی مواقع هم Access Violation میده
آیا همیشه یک رویه به خصوص را تست می کنی که یک بار خطا می دهد و یک بار نمی دهد.
شاید در بعضی از مواقع کار بخصوصی می کن کهAccess Violationمی دهد.


خط های برنامه را درست چک کن .همانجور که می دانی زمانی پیغام Access Violation می دهد که چیزی وجود نداشته باشد(احتمالا کامپونت ، فرم و . . . را Free می کنی.)

soroush_vs
یک شنبه 26 فروردین 1386, 08:46 صبح
همیشه یک رویه خاص را طی میکنم ممکنه چند بار برنامه بدون Error خارج شه چند بار Error بده چند بار هم بجای Error اصلا خارج نشه و CPU Usage پروسس برنامه بشه 80 تا 90 درصد.
این مورد واقعا عجیبه اصلا با عقل جور در نمیاد.

arshia_
یک شنبه 26 فروردین 1386, 12:15 عصر
من حدس می زنم شما یه پروسه دارید که بعضی وقتها درست عمل می کنه و مشکلی پیش نمی آد.اما در بقیه حالتها برنامه رو به یه حلقه بی انتها می بره و یا بن بست رخ می ده
سعی کنید عناصر برنامه رو یکی یکی غیر فعال کنید تا متوجه بشین کدوم شی باعث ایجاد مشکل می شه
اگر بانک اطلاعاتی هم داری سعی کن ارتباط اون رو هم تست کنی

SYNDROME
یک شنبه 26 فروردین 1386, 19:51 عصر
با سلام
ممکن شما یک رویه خاص را طی کنید ولی حتما از دید سیستم این رویه ها متفاوت است.
شروع به غیر فعال کردن کدهای برنامه و کامپونتها بکن حتما Error را پیدا می کنی.

soroush_vs
یک شنبه 26 فروردین 1386, 20:00 عصر
باشه این کار رو میکنم و نتیجه رو اعلام میکنم

ghabil
دوشنبه 27 فروردین 1386, 11:23 صبح
کد قبلی رو اینطوری کامل کن:


var
i: Integer;
begin
for i:= Screen.FormCount - 1 downto 0 do
try
if Screen.Forms[i] <> Application.MainForm then Screen.Forms[i].Free;
except
ShowMessage(IntToStr(i));
raise;
end;

try
Application.MainForm.Free;
except
ShowMessage('MainForm');
raise;
end;

ShowMessage('Forms Freed OK');

اینو بزار روی یک باتن روی یک از فرم هات و اجراش کن. نتیجه رو بگو

soroush_vs
سه شنبه 28 فروردین 1386, 13:20 عصر
این کد خیلی جالبه

soroush_vs
سه شنبه 28 فروردین 1386, 13:25 عصر
آقای کوشا باید با تعجب بگم که این پیغام Forms Freed OK ظاهر میشه و بعدش Access Violation میده
در ضمن برنامه یا همون پروسس برنامه در حال اجرا میمونه و میشه توی Task Manager دیدش.

ghabil
سه شنبه 28 فروردین 1386, 14:12 عصر
تو برنامت DataModule داری؟

soroush_vs
سه شنبه 28 فروردین 1386, 15:05 عصر
آره چطور مگه؟
نکنه از اینه؟

ghabil
سه شنبه 28 فروردین 1386, 20:29 عصر
var
i: Integer;
begin
for i:= Screen.DataModulesCount - 1 downto 0 do
try
Screen.DataModules[i].Free;
except
ShowMessage(IntToStr(i));
raise;
end;

soroush_vs
شنبه 16 تیر 1386, 16:27 عصر
بالاخره مشکل رو متوجه شدم.البته مشکل کاملا حل نشده.
برنامه من حدود 80 تا 90 فرم داره و من در زمان ابتدای اجرا اونها رو بصورت اتوماتیک(پیش فرض) Create میکردم .اما الان اونها رو بصورت دینامیک Create میکنم.یعنی موقعی که لازم میشه فرمی رو Create میکنم.
ولی با این وجود از وجود چنین پیغام خطایی در حالت قبل تعجب میکنم.

soroush_vs
شنبه 16 تیر 1386, 16:30 عصر
اما چرا مشکل کاملا حل نشده.هنگام خروج از برنامه(البته نه همیشه) CPU Usage برنامه تا حد ممکن بالا میره حتی 99 درصد و به هیچ وجه برنامه خودش بسته نمیشه.برای بستن برنامه حتما باید از طریق Task Manager اقدام کنم.
دوستان کسی نظری داره؟

Mahmood_M
شنبه 16 تیر 1386, 16:36 عصر
توی برنامتون از Thread ای استفاده نکردید ؟

soroush_vs
شنبه 16 تیر 1386, 17:52 عصر
نه دوست من
در ضمن خود دلفی هم گاهی موقع خروج دقیقا همین حالت براش پیش میاد(یعنی Terminate نمیشه و CPU Usage میشه 99 درصد) بقیه Application ها مشکلی ندارن اونهایی که با دلفی مرتبط هستن این مشکل رو دارن
تا به حال این مشکل رو با خود دلفی داشتید؟

Arman_1367
یک شنبه 17 تیر 1386, 09:15 صبح
ببخشید وسط حرف شما دوستان با تجربه پریدم ولی ببین احتمالاً در جایی از اجرای برنامه که فرم ها کم یا زیاد میشه خطایی رخ می دهد که به درستی مدیریت نشده به همین دلیل قبل از خروج این مشکل پیش می آید البته دلایل زیادی ممکنه وجود داشته باشه اما قطعاً مربوط به فرم هایی که به یا دیتا ماپول های شما است پس دنبال این گونه موارد باشید .
در ضمن در رابطه با دلفی هم اگر پکیجهایی که باگ دارند نصب بشه این مشکل ایجاد می شود.
راستی اگر یه دیباگر حرفه ای که تجربه زیادی داره استخدام کنی سریعتر به نتیجه می رسی.

soroush_vs
یک شنبه 17 تیر 1386, 09:44 صبح
ببخشید وسط حرف شما دوستان با تجربه پریدم ولی ببین احتمالاً در جایی از اجرای برنامه که فرم ها کم یا زیاد میشه خطایی رخ می دهد که به درستی مدیریت نشده به همین دلیل قبل از خروج این مشکل پیش می آید البته دلایل زیادی ممکنه وجود داشته باشه اما قطعاً مربوط به فرم هایی که به یا دیتا ماپول های شما است پس دنبال این گونه موارد باشید .

ممنون از راهنمایی اما من با این مورد مخالف هستم چون این مشکل رو زمانی که مدیریت حافظه ی فرم ها و ماژول ها با دلفی و بصورت اتوماتیک (خودکار)بود هم داشتم.


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


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

Arman_1367
یک شنبه 17 تیر 1386, 14:11 عصر
من نگفتم مدیریت حافظه شما غلطه.
ببین گاهی اوقات بعضی از جاها در برنامه های خیلی بزرگ مدیریت حافظه دلفی ضعیف عمل می کنه برای همین باید تمام فرم ها و ... را به صورت دستی ایجاد کنی و بعد دوباره آزاد کنی البته می دونم کار سختیه برای همین گفتم از یک نفر که خیلی کار دیباگ کرده و دیگه اند برنامه نویسیه استفاده کن .

راستی چک کن ببین قبل از خروج از یکی از فرم ها یا دیتاماژولها کدی ننوشته ای که بخواهد مثلاً عملیاتی روی یک کمپاننت انجام بده.ممکنه مشکل از اینهم باشه البته فکر کنم با سوابق شما بعید باشه اما گفتم یک وقت از قلم نیفته.

soroush_vs
یک شنبه 17 تیر 1386, 18:40 عصر
نتیجه گیری جدید من
وقتی که این مشکل پیش میاد.هر بار که برنامه رو اجرا و Terminate میکنم این مشکل تکرار میشه تا اینکه سیستم رو Restart کنم.و دیگه این مشکل رو ندارم.فکر میکنم ارتباط چندانی با خود نرم افزار نداشته باشه.