PDA

View Full Version : وقتی برنامه را میبندم نام اون هنوز توی Process هست



حسین شهریاری
سه شنبه 10 آذر 1388, 11:14 صبح
سلام

من توی یکی از برنامه هایی که نوشتم یه مشکل دارم و اون اینه که وقتی برنامه بسته میشه(حالا یا با Halt یا Application.terminate) هنوز اسم اون توی لیست processهای ویندوز هست.میدونم شاید یه چیزی هنوز باز مونده باشه ولی هر چی سعی کردم نتونستم راهی براش پیدا کنم.تا اینکه اومدم قبل از خروج از برنامه تمام فرمهاما Destory یا Free کردم.
مشکل حل شد ولی کار عاقلانه ای نیست.

حالا سوالم اینه که آیا تابع سیستمی سراغ دارید که بتونه یه process را از لیست پروسه های ویندوز حذف کنه تا دیگه اون پروسه توی سف سرویس CUP نباشه و فضایی توی حافظه دیگه اشغال نکنه؟

ممنون

Felony
سه شنبه 10 آذر 1388, 11:18 صبح
خوب اگر بحث عاقلانه کار کردن باشه ، کار عاقلانه این هست که ببینی چه چیزی تو برنامت هست که تو حافظه میمونه و باعث این مشکل میشه ، وگرنه همون Free کردن همه ی فرم ها خوبه .

حسین شهریاری
سه شنبه 10 آذر 1388, 12:05 عصر
بله عزیزم من هم خیلی تلاش کردم ولی نتونستم پیداش کنم

دوستان دیگه کسی نظری نداره!

tdkhakpur
سه شنبه 10 آذر 1388, 12:19 عصر
کد برای خارج کردن مستقیم از صف پردازنده.


procedure TForm1.Button1Click(Sender: TObject);
var
ExitCode : DWORD;
ProcessId: longint;
begin
ProcessId := GetCurrentProcess;
GetExitCodeProcess(ProcessId, ExitCode);
TerminateProcess(ProcessId, ExitCode);
end;

AliReza Vafakhah
سه شنبه 10 آذر 1388, 12:24 عصر
Free کردن همه ی فرم ها خوبه .

فکر نکنم کار درستی باشه !

یادم اوایل کتاب دلفی 7 رو مطالعه می کردم گفته بود که بهتره اشیا به جای Free از تابع FreeAndNil استفاده بشه .

البته آقای کشاورز هم یه جا توضیح داده بودن که این تابع با کمک گیری از یه متغیر Temp از شی ابتدا به اون nil رو اختصاص میده و سپس Free میکنه .

procedure FreeAndNil(var Obj);
var
Temp: TObject;
begin
Temp := TObject(Obj);
Pointer(Obj) := nil;
Temp.Free;
end;

حسین شهریاری
سه شنبه 10 آذر 1388, 13:16 عصر
کد برای خارج کردن مستقیم از صف پردازنده.


procedure TForm1.Button1Click(Sender: TObject);
var
ExitCode : DWORD;
ProcessId: longint;
begin
ProcessId := GetCurrentProcess;
GetExitCodeProcess(ProcessId, ExitCode);
TerminateProcess(ProcessId, ExitCode);
end;


ممنون دوست گرامی.میشه بفرمایید من processId برنامه را چطوری میتونمک بدست بیارم؟

tdkhakpur
سه شنبه 10 آذر 1388, 17:32 عصر
ممنون دوست گرامی.میشه بفرمایید من processId برنامه را چطوری میتونمک بدست بیارم؟
خب شما کدها را داخل برنامه استفاده کنید اگر با این کدها مشکل شما حل نشد برنامه شما ایراد دارد و بعضی از برنامه ها و یا dll هایی را که لود کرده است را آزاد نمی کند.
ولی اینکه اگر منظورتان دریافت processId خارج از برنامه باشد نمونه برنامه جهت خاتمه پردازش همراه کامپایلر دلفی هست یک نگاهی بندازید پیدا میکنید.

vcldeveloper
سه شنبه 10 آذر 1388, 23:50 عصر
کد برای خارج کردن مستقیم از صف پردازنده.
کار جالبی نیست؛ در واقع پاک کردن صورت مسئله هست. TerminateProcess یک Process را به زور میبنده و اگر شما در برنامه خودتان نیاز دارید برای بستن برنامه از آن استفاده کنید، یعنی کلا برنامه شما مشکل داره، و شما دارید سعی می کنید مشکل را ماست مالی کنید!


هنوز اسم اون توی لیست processهای ویندوز هست.
احتمالا Threadایی را در برنامه اجرا کردید، و قبل از خاتمه دادن به آن، سعی در خاتمه دادن Process دارید.

K.Mohammadreza
چهارشنبه 11 آذر 1388, 16:35 عصر
به نظر من کافيه برنامه را بصورت خطي احرا کني و رد جاهاي مختلف برنامه Linebreak بذاري تا از عملکرد برنامه مطمئن بشي