PDA

View Full Version : پایان دادن به پروسه



amir_civil
جمعه 16 دی 1384, 17:23 عصر
سلام دوستان
چه جوری میشه به اجرای یه پروسه پایان داد؟
ممنون

Marine
جمعه 16 دی 1384, 18:05 عصر
اگه منظورت حلقست ، با استفاده از دستور break این کار امکان پذیره

amir_civil
جمعه 16 دی 1384, 18:36 عصر
سلام دوست من
منظورم نحوه استفاده از دستور exit processمیباشد
اگه یه مثال بزنید ممنونم میشم
ممنون

Marine
جمعه 16 دی 1384, 20:02 عصر
دستور exit به اجرای برنامه خاتمه میده




int a[20] ,i;

cin >> i;
if (i>0 && i<20)
cout << a[i];
else
exit(1);

amir_civil
جمعه 16 دی 1384, 21:11 عصر
سلام دوست من
منظورم یه پروسه در حال اجراست

Inprise
جمعه 16 دی 1384, 21:55 عصر
TerminateProcess

amir_civil
شنبه 17 دی 1384, 09:03 صبح
سلام
مشکل من در پیدا کردن uExitCode هستش
ممنون

sh_roohani
شنبه 17 دی 1384, 10:26 صبح
سلام،
مطمئن نیستم، ولی فکر می کنم برگردوندن 0 مشکل رو حل کنه. معمولا وقتی یه پروسس مقدار 0 رو به shell بر می گردونه، یعنی بی دردسر تموم شده، حالا از اونجایی که Shell هم خودش یه پروسس هست که پروسس های دیگه رو فرا می خونه، بنابراین اگه شما هم از داخل یه پروسس، پروسس دیگه ای بسازین، uExitCode اون به نظرم باید 0 باشه، مگه اینکه مشکلی پیش بیاد.

amir_civil
شنبه 17 دی 1384, 18:05 عصر
سلام اقای روحانی
ممنون
ولی مشکل به این راحتی حل نمیشه
خود اینuExitCode هم توسط یه دستور دیگه پیدا میشه که من بلد نیستم از اون استفاده کنم
ممنون
(اگه بتونین با مثال هم توضیح بدیم ممنون میشم)

sh_roohani
شنبه 17 دی 1384, 18:09 عصر
سلام،
ببینین، فکر کنم یه اشتباهی شده. اگه منظورتون توابع GetExitCodeProcess و GetExitCodeThread هست، اونا واسه این هستن که شما بتونین وضعیت جاری یه Process یا Thread رو چک کنین و ببینین که آیا خارج شدن یا نه. این توابع کد خروجی مورد نیاز رو برای شما تولید نمی کنن.

amir_civil
شنبه 17 دی 1384, 18:56 عصر
سلام
منظورم کد زیر هستش:

VOID ExitProcess(

UINT uExitCode // exit code for all threads
);

sh_roohani
شنبه 17 دی 1384, 19:01 عصر
ببینین، من هنوزم فکر می کنم اگه شما به جای uExitCode مقدار 0 رو قرار بدین، همه چی درسته. چون فکر نکنم Exit Code چیز جادویی باشه. به نظرم این دقیقا مثل این می مونه که شما بپرسین "خوب آخر تابع main باید چه مقداری رو return کنم؟". شما همیشه وقتی همه چی خوب پیش رفته و می دونین که برنامه داره به صورت عادی تموم می شه، از این کد استفاده می کنین:

return 0;
حالا شما امتحان کردین که برگردوندن 0 مشکلتونو حل می کنه یا نه؟

C++Lover
یک شنبه 18 دی 1384, 06:42 صبح
آرگومان lpExitCode از GetExitCodeProcess در صورتی که process پایان نیافته باشد مقدار STILL_ACTIVE رو بر می گردونه و اگر پروسس پایان یافته باشد uExitCode ای که به TerminateProcess یا ExitProcess داده شده یا مقدار بازگشتی تابع winmain یا main یا مقدار Exception ای که باعث تمام شدن process شده است را بر می گرداند.
در ضمن در خیلی مواقع لازم می شود که بدانیم که process یا thread مورد نظر با چه کدی پایان یافته است.

amir_civil
یک شنبه 18 دی 1384, 07:53 صبح
سلام
میشه یه مثال بزنید
ممنون

sh_roohani
یک شنبه 18 دی 1384, 08:13 صبح
سلام،
ببین عزیز من، شما که یه پروسس می سازی، معمولا همه کار و زندگیتو ول نمی کنی که دایم چک کنی ببینی پروسس فرزند، خارج شده یا نه. اگه بخوای همچین کاری بکنی، کدی مشابه این می نویسی (اینو عینا از MSDN کپی کردم):

void main( VOID )
{
STARTUPINFO si;
PROCESS_INFORMATION pi;

ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );

// Start the child process.
if( !CreateProcess( NULL, // No module name (use command line).
"MyChildProcess", // Command line.
NULL, // Process handle not inheritable.
NULL, // Thread handle not inheritable.
FALSE, // Set handle inheritance to FALSE.
0, // No creation flags.
NULL, // Use parent's environment block.
NULL, // Use parent's starting directory.
&si, // Pointer to STARTUPINFO structure.
&pi ) // Pointer to PROCESS_INFORMATION structure.
)
{
ErrorExit( "CreateProcess failed." );
}

// Wait until child process exits.
WaitForSingleObject( pi.hProcess, INFINITE );

// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}
اما اینکار باعث می شه، اجرای Thread اصلی از Process پدر متوقف بشه تا زمانی که Process فرزند خارج بشه. حالا اگه بخوای در این حین، پروسس اصلی به کار و زندگی خودش برسه، شما تنها کاری که باید بکنی اینه که متناوبا وضعیت پروسس فرزند رو چک کنی و در فواصل این تناوب هم به کار خودت برسی. حالا چه جوری؟
اینجاس که از GetExitCodeProcess استفاده می کنی:

DWORD dwExitCode = 0;
...
GetExitCodeProcess(pi.hProcess, &deExitCode);
if (dwExitCode == STILL_ACTIVE)
{
// The child process is still active.
// Do whatever you do.
}
else
{
// The child process has terminated.
}
به شهادت MSDN، اگه مقدار dwExitCode برابر STILL_ACTIVE نباشه، یکی از مقادیر زیر خواهد بود:

مقدار خروجی مشخص شده در تابع ExitProcess یا TerminateProcess.
مقدار برگشتی تابع main یا WinMain پروسس فرزند.
مقدار Exception برای یه exception پردازش نشده که باعث پایان یافتن پروسس شده.

این کد رو معمولا تو یه حلقه یا یه تایمر می ذاری که متناوبا اجرا بشه و بعد از اجرای اون (یعنی سنجیدن وصعیت پروسس فرزند)، شما فرصت داشته باشی به بقیه کارای پروسس والد برسی.
خوب، بنابراین می بینین که شما مقدار برگشتی GetExitCodeProcess رو به تابع TerminateProces پاس نمی کنین، بلکه برعکس، مقدار پاس شده به تابع TerminateProcess رو با تابع GetExitCodeProcess چک می کنین.
امیدوارم این چیزا به دردتون بخوره. اگه بازم سوالی هست، در خدمتم.