SORU
10 EYLÜL 2008, ÇARŞAMBA


Nasıl otomatik olarak Windows alt süreç yok edeceğim?

C Windows app, ben birkaç uzun koşu çocuk süreçlerini başlatmak (şu anda CreateProcess kullanıyorum(...) bunu yapmak için.

Çocuk otomatik olarak kapatılması süreçleri istiyorumeğer benim ana işlemler çöküyorya da kapalı.

Bu bir kaza için çalışması gereken bu gereksinim nedeniyle "" bu yapılması gereken bazı işletim sistemi API/özelliği kullanmak gerekir sanırım. üst Yani hepsi "çocuk" işler temizlenir.

Bunu nasıl yapabilirim?

CEVAP
10 EYLÜL 2008, ÇARŞAMBA


Windows API nesneleri kullanırlar "İş Nesneleri". Aşağıdaki kod oluşturur "iş ana uygulama sona erdiğinde" tüm işlemleri kapatmak için yapılandırılmış onun temizlediğini işlediğinde (). Bu kod yalnızca bir kez. çalıştırılması gerekir:

HANDLE ghJob = CreateJobObject( NULL, NULL); // GLOBAL
if( ghJob == NULL)
{
    ::MessageBox( 0, "Could not create job object", "TEST", MB_OK);
}
else
{
    JOBOBJECT_EXTENDED_LIMIT_INFORMATION jeli = { 0 };

    // Configure all child processes associated with the job to terminate when the
    jeli.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;
    if( 0 == SetInformationJobObject( ghJob, JobObjectExtendedLimitInformation, &jeli, sizeof(jeli)))
    {
        ::MessageBox( 0, "Could not SetInformationJobObject", "TEST", MB_OK);
    }
}

Her alt süreç oluşturulduğunda, her çocuk, her işlem başlatmak ve iş eklemek için aşağıdaki kodu nesne çalıştırın:

STARTUPINFO info={sizeof(info)};
PROCESS_INFORMATION processInfo;

// Launch child process - example is notepad.exe
if (::CreateProcess( NULL, "notepad.exe", NULL, NULL, TRUE, 0, NULL, NULL, &info, &processInfo))
{
    ::MessageBox( 0, "CreateProcess succeeded.", "TEST", MB_OK);
    if(ghJob)
    {
        if(0 == AssignProcessToJobObject( ghJob, processInfo.hProcess))
        {
            ::MessageBox( 0, "Could not AssignProcessToObject", "TEST", MB_OK);
        }
    }

    // Can we free handles now? Not sure about this.
    //CloseHandle(processInfo.hProcess); 
    CloseHandle(processInfo.hThread);
}

VİSTA NOT: erişim engellendi AssignProcessToObject ile ilgili sorunlar karşılaşırsanız AssignProcessToJobObject always return "access denied" on Vista (Bkz vista.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bogdan Gabriel

    Bogdan Gabri

    5 Aralık 2006
  • Liberator

    Liberator

    14 EYLÜL 2007
  • Yo Mama

    Yo Mama

    18 EYLÜL 2005