PDA

View Full Version : چک کردن در حال اجرا بودن یک Process



polina1930
پنج شنبه 19 خرداد 1390, 00:53 صبح
سلام
یه مشکل داشتم
میخوام تو برنامه با زدن یک دکمه یک فایلexe اجرا بشه و برنامه دائم چک کنه که این فایل exe درحال اجرا هست و بعداز اینکه فایل exe بسته شد . یک فایل exe دیگه اجرا بشه
با تشکر

mehran_minayi
پنج شنبه 19 خرداد 1390, 17:30 عصر
خوب از کلاس process استفاده کن

B.I.O.H.A.Z.A.R.D
پنج شنبه 19 خرداد 1390, 18:15 عصر
همین الان نوشتم. ببینید مشکلتون حل میشه یا نه

private bool ProcessExists(string name)
{
return Process.GetProcesses().Any(x => x.ProcessName == name);
}

private void button7_Click(object sender, EventArgs e)
{
if (ProcessExists("wmplayer"))
{
MessageBox.Show("Media player is running");

}
else
{
if (!ProcessExists("wmplayer"))
{
System.Diagnostics.Process.Start(@"C:\Program Files\Zoom Player\zplayer.exe");

}
}
}

polina1930
پنج شنبه 19 خرداد 1390, 19:53 عصر
سلام
دست شما درد نکنه ولی مشکلم حل نشد
ببین من میخوام که با زدن یک دکمه یه برنامه مثلا ali.exe اجرا بشه در همین موقع تو برنامه اصلی چک کنه که برنامه باز هست یا نه و هنگامی که برنامه ali.exe بسته بشه یک پیغام بده

با تشکر

B.I.O.H.A.Z.A.R.D
پنج شنبه 19 خرداد 1390, 21:42 عصر
برنامشو اونطور که میخواستید نوشتم. فقط جای مدیاپلیر آدرس همون برنامه (مثلا ali.exe) رو بهش بدید. برنامه هر 5 ثانیه چک میکنه اگه برنامه مورد نظر بسته شده باشه پیغام میده.

vcldeveloper
جمعه 20 خرداد 1390, 00:21 صبح
ببین من میخوام که با زدن یک دکمه یه برنامه مثلا ali.exe اجرا بشه در همین موقع تو برنامه اصلی چک کنه که برنامه باز هست یا نه و هنگامی که برنامه ali.exe بسته بشه یک پیغام بدهمی تونید یک هندل از process در حال اجرای مد نظر خودتان به دست بیارید؛ اگر process را خودتان اجرا نکردید، با استفاده از تابع OpenProcess می تونید این هندل را به دست بیارید. اگر process را خودتان اجرا می کنید، تابع CreateProcess خودش یک هندل بهتون برگشت میده؛ اون وقت می تونید از این هندل برگشتی در تابع WaitForSingleObject ویندوز استفاده کنید، تا برنامه شما تا زمان اتمام کار اون process منتظر باقی بمونه. اگر نمیخواید کل برنامه شما منتظر اتمام کار اون Process باقی بمونه، می تونید WaitForSingleObject رو در یک Thread جداگانه فراخوانی کنید. به این ترتیب، نیازی به چک کردن پیوسته وجود یا عدم وجود اون process نیست، و توان پردازشی CPU هم برای همچین چکی تلف نمیشه.

این توابعی که نام بردم، توابع API ویندوز هستند، می تونید ازشون در دات نت به صورت کد unmanaged استفاده کنید. البته ممکنه معادل هایی هم در دات نت فریم ورک داشته باشند؛ من از دات نت استفاده نمی کنم، و اطلاعی از معادل های موجود این توابع ندارم، اما روش کار مد نظر شما در ویندوز به همین شکلی هست که گفتم. براش هم می تونید انواع نمونه کد به زبان های ++C\C یا دلفی و غیره پیدا کنید (احتمالا نمونه #C اش هم موجوده). می تونید عبارتی مثل Create process and wait را در اینترنت جستجو کنید.


Update:

این هم نمونه کد #C با استفاده از کلاس Process موجود در دات نت فریم ورک:
http://support.microsoft.com/kb/305369

polina1930
جمعه 20 خرداد 1390, 02:09 صبح
با سلام
دست شما دوستان درد نکنه . مشکل حل شد خیلی خیلی ممنون.

r00tkit
جمعه 20 خرداد 1390, 08:24 صبح
سلام
تو .NET از WaitForExit استفاده کن