PDA

View Full Version : مشکل با خاتمه دادن به برنامه



mbshareat
یک شنبه 05 دی 1389, 17:17 عصر
با سلام و عرض ادب:قلب:
چند بار شده تو برنامه از Application.terminate استفاده کردم ولی همون موقع برنامه خاتمه پیدا نکرده.
مثلا من یه برنامه دارم که یه لیست از بخشی از محتویات فایلها درست می کنه و بعد بعد از تصحیح تو فایلها می ریزه واگر در این بین اشکالی در هنگام نوشتن پیش بیاد پیغام خطا می ده و برنامه رو می بنده ولی در عمل می بینم بعد نمایش خطا کار بعدی که تجدید لیست هست رو هم انجام می ده بعد برنامه رو می بنده.:گیج:
آیا کار این دستور دقیقا چیه؟:متفکر:

Felony
یک شنبه 05 دی 1389, 20:10 عصر
با فراخوانی Application.Terminate در حقیقت دارید تابع PostQuitMessage رو فراخوانی میکنید ، این تابع پیغام WM_Quit رو به صف پیغام های ترد اصلی برنامه ارسال میکنه و صف هم که FIFO هست پس پردازش پیغام ها نسبت به اولویت ورودشون انجام میشه ، پس تضمینی نیست که بلافاصله بعد از فراخوانی این متد برنامتون بسته بشه ، در مورد دلیل وقوع اون مشکل باید کدتون رو دید ممکنه فایل ها هنوز در حال استفاده باشن یا درست آزادشون نکرده باشید یا ...

@ تو شرایط استثنائی میتونید از Halt استفاده کنید ولی توصیه نمیشه .

mbshareat
دوشنبه 06 دی 1389, 19:27 عصر
با سلام و درود
جناب استاد تاجیک گرامی :قلب:از توضیحتون ممنونم.
ولی به نظر نمی رسه اولویت برای کارهای پروسیجرم باشه بعدی باشه.
این هم کد:

Procedure TEasyTreeForm.ReSetFilesTree();
Var
I:SmallInt;
MyOnv:OnvData;
Delta:SmallInt;{?? E?C?I ???? ?? ECOI}
Begin
RefreshForm.PromptLabel.Visible:=False;
RefreshForm.RefreshBut.Visible:=False;
RefreshForm.PromptLabel2.Visible:=True;
RefreshForm.Show;
RefreshForm.Refresh;
CurFileNo:=Onv[OI[1]].FileNo;
LoadFileStr;
For I:=1 To OINo Do
If Onv[OI].Mode<>Onvan then
Begin
MyOnv:=Onv[OI[I]];//E?C? E???? I??I C?E?C? ?ECE
{E?E??? ?C? ??? E?C? I??I E?E? ?C? ?CE? I? ???E
???I C?E ?? ??? I??I ??E?I? ?? ???C? ?? ???? C?E
C? ?E? I? ?C?? ?E?I? ECOI ?C ???E ?E? ?? ???? C?E
???E ???C? ECOI ?? I? ?I E?E?}
ChangeMode(Onv[OI[I]].FIPos,Onv[OI[I]].Mode)
End
Else
Begin
MyOnv:=Onv[OI[I]];
If I=1 then
Delta:=((-1)-MyOnv.lev+1)-MyOnv.PercentNo
Else//C?? I? ?? ??? ECO?I E?ICI I??I ??? C?E ?? ???
Delta:=(Onv[OI[I-1]].lev-MyOnv.lev+1)-MyOnv.PercentNo;
If Delta<0 then
DelPercents(Onv[OI[I]].FIPos-1,-Delta)
Else If Delta>0 then
AddPercents(Onv[OI[I]].FIPos,Delta);
End;
{E?E? ???? I??I?C? C?E?C? ?C??}
If MyOnv.lev>-1 then
Begin
{(FINO-MyOnv.FIPos)=End PercentNo!}
Delta:=(MyOnv.lev+1)-(FINO-MyOnv.FIPos);
If Delta<0 then
DelPercents(FINo,-Delta)
Else If Delta>0 then
AddPercents(FINo,Delta);
End;
{?I??? OI? AI??? ?C??? ?? EU??? ??I?}
SaveFileStr;
RefreshForm.Hide;
RefreshForm.PromptLabel.Visible:=True;
RefreshForm.RefreshBut.Visible:=True;
RefreshForm.PromptLabel2.Visible:=False;
{E?C? I?C?I? ??? I??I E?E? EC?I ?C???C C? C?? I?C?I? O??I}
LastItem:=-1;
ReadFiles();
OnvListClick(nil);
End;

تو این کد هم داخل پروسیجر DelPercents و هم در AddPercents تستی صورت می پذیرد که در حالتی Application.terminate اجرا می شه ولی نه تنها برنامه تموم نمی شه بلکه ReadFiles هم که انتهای کد بالا کل فایلها رو از اول می خونه و بعد از این دو پروسیجر که فایلها رو دستکاری می کنند قرار داره اجرا خواهد شد.
البته خوشبختانه مشکلی ایجاد نمی کنه ولی اجرای اینگونه برنامه غیر منطقیه.
در ضمن منظورتون از اینکه فرمودید توصیه نمیشه از Halt استفاده بشه چیه؟مگه کار این دستور چیه؟
----
تا توا نی به جهان خدمت محتاجان کن به [I]دمی یا درمی یا قدمی یا قلمی (http://simasamai.persianblog.ir/post/21/)

mbshareat
دوشنبه 06 دی 1389, 19:28 عصر
با سلام و درود
جناب استاد تاجیک گرامی :قلب:از توضیحتون ممنونم.
ولی به نظر نمی رسه اولویت برای کارهای پروسیجرم باشه بعدی باشه.
این هم کد:

Procedure TEasyTreeForm.ReSetFilesTree();
Var
I:SmallInt;
MyOnv:OnvData;
Delta:SmallInt;
Begin
RefreshForm.PromptLabel.Visible:=False;
RefreshForm.RefreshBut.Visible:=False;
RefreshForm.PromptLabel2.Visible:=True;
RefreshForm.Show;
RefreshForm.Refresh;
CurFileNo:=Onv[OI[1]].FileNo;
LoadFileStr;
For I:=1 To OINo Do
If Onv[OI].Mode<>Onvan then
Begin
MyOnv:=Onv[OI[I]];
ChangeMode(Onv[OI[I]].FIPos,Onv[OI[I]].Mode)
End
Else
Begin
MyOnv:=Onv[OI[I]];
If I=1 then
Delta:=((-1)-MyOnv.lev+1)-MyOnv.PercentNo
Else
Delta:=(Onv[OI[I-1]].lev-MyOnv.lev+1)-MyOnv.PercentNo;
If Delta<0 then
DelPercents(Onv[OI[I]].FIPos-1,-Delta)
Else If Delta>0 then
AddPercents(Onv[OI[I]].FIPos,Delta);
End;
If MyOnv.lev>-1 then
Begin
{(FINO-MyOnv.FIPos)=End PercentNo!}
Delta:=(MyOnv.lev+1)-(FINO-MyOnv.FIPos);
If Delta<0 then
DelPercents(FINo,-Delta)
Else If Delta>0 then
AddPercents(FINo,Delta);
End;
SaveFileStr;
RefreshForm.Hide;
RefreshForm.PromptLabel.Visible:=True;
RefreshForm.RefreshBut.Visible:=True;
RefreshForm.PromptLabel2.Visible:=False;
LastItem:=-1;
ReadFiles();
OnvListClick(nil);
End;

تو این کد هم داخل پروسیجر DelPercents و هم در AddPercents تستی صورت می پذیرد که در حالتی Application.terminate اجرا می شه ولی نه تنها برنامه تموم نمی شه بلکه ReadFiles هم که انتهای کد بالا کل فایلها رو از اول می خونه و بعد از این دو پروسیجر که فایلها رو دستکاری می کنند قرار داره اجرا خواهد شد.
البته خوشبختانه مشکلی ایجاد نمی کنه ولی اجرای اینگونه برنامه غیر منطقیه.
در ضمن منظورتون از اینکه فرمودید توصیه نمیشه از Halt استفاده بشه چیه؟مگه کار این دستور چیه؟
----
تا توا نی به جهان خدمت محتاجان کن به [I]دمی یا درمی یا قدمی یا قلمی (http://simasamai.persianblog.ir/post/21/)

Felony
دوشنبه 06 دی 1389, 20:44 عصر
الان با این سورس چی کار کنیم ؟ تو سورستون یه سری روال صدا زدید که معلوم نیست توش چی کار میکنید ، سورس برنامه رو قرار بدید .


در ضمن منظورتون از اینکه فرمودید توصیه نمیشه از Halt استفاده بشه چیه؟مگه کار این دستور چیه؟
از Halt نباید استفاده کنید چون برای مواقع اضطراری هست و تضمین نمیکنه که منابعی که پروژه در اختیار گرفته رو به صورت کامل آزاد کنه .

mbshareat
سه شنبه 07 دی 1389, 10:27 صبح
سلام و خدا قوت:قلب:
جناب اقای تاجیک عزیز خدا شما رو حفظ کنه.:تشویق:
من نمی خواستم درگیر برنامم بشین به نظرم اومد همینکه نشون بدم که دستور واقع بعد از Application.Terminate اجرا میشه، کافیه.
برنامم یه کم نامانوسه و فکر کنم کل کد رو بذارم گیج کننده باشه.
این برنامه برای کار بر روی فایلهای با قلم داس و فرمت زدن عناوین کتاب با کارکترهای تعریف شده هست و سطح عنوان رو تنظیم می کنه.:گیج:
تا همینجاش هم خیلی لطف کردین. این اواخر فهمیدم که خیلی مهمه برنامم فی الفور متوقف بشه؛ چون اگه متوقف نشده به دفعات به فایل محل خطا وارد میشه که اصلا جالب نیست.سعی می کنم با بررسی یه متغیر عمومی بروز خطا رو بررسی کنم و از پروسیجر فراخوانی کننده خارج شم.:بامزه:
اگه دستور ویژه ای مثل Application.Terminate سراغ دارین راهنمایی بفرمایین.:چشمک:
---
آن کس که بداند و بداند که بداند اسب شرف از گنبد گردون بجهاند
آن کس که بداند و نداند که بداند بیدار کنیدش که بسی خفته نماند
آن کس که نداند و بداند که نداند لنگان خرک خویش به منزل برساند
آن کس که نداند و نداند که نداند در جهل مرکب ابدالدهر بماند
شاعر: ابن یمین