c++ क्या मैं एक थ्रेड को छोड़कर एक प्रक्रिया निलंबित कर सकता हूँ?




dll mfc (2)

मैं एक थ्रेड को छोड़कर एक प्रक्रिया निलंबित (या रोकें) जा रहा हूँ

मैंने SuspendThread (एपी फंक्शन) का उपयोग करने की कोशिश की है और इसका परिणाम प्रक्रिया थ्रेड गैर-जवाबदेह स्थिति बन गया है।

यह मैं नहीं चाहता था मैं एक धागा को फिर से शुरू करना चाहता हूं जिससे मुझे बड़ा काम करना चाहिए।

इसे कैसे हल किया जा सकता है? कृपया अपना विचार दें

धन्यवाद।


जहाँ तक मुझे पता है कि आप एक धागा को छोड़कर किसी प्रक्रिया को निलंबित नहीं कर सकते ... क्योंकि जब प्रक्रिया बाहर निकलती है, तो सभी थ्रेड्स भी निकल जाएंगे। अगर आप एक थ्रेड के बजाय चाहते हैं तो आप बच्चे की प्रक्रिया को पैदा कर सकते हैं और इसका इस्तेमाल कर सकते हैं ..


आप किसी प्रक्रिया से संबंधित थ्रेड्स की सूची प्राप्त करने के लिए CreateToolhelp32Snapshot पर कॉल कर सकते हैं। एक बार आपके पास यह सूची है कि वह अभी भी पुनरावृत्त करे, हालांकि वह वर्तमान थ्रेड आईडी से मेल नहीं खाता है और हर थ्रेड को निलंबित करता है। नीचे दिए गए उदाहरण का परीक्षण नहीं किया गया है लेकिन इसे ठीक से काम करना चाहिए।

#include <windows.h>
#include <tlhelp32.h>

// Pass 0 as the targetProcessId to suspend threads in the current process
void DoSuspendThread(DWORD targetProcessId, DWORD targetThreadId)
{
    HANDLE h = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
    if (h != INVALID_HANDLE_VALUE)
    {
        THREADENTRY32 te;
        te.dwSize = sizeof(te);
        if (Thread32First(h, &te))
        {
            do
            {
                if (te.dwSize >= FIELD_OFFSET(THREADENTRY32, th32OwnerProcessID) + sizeof(te.th32OwnerProcessID)) 
                {
                    // Suspend all threads EXCEPT the one we want to keep running
                    if(te.th32ThreadID != targetThreadId && te.th32OwnerProcessID == targetProcessId)
                    {
                        HANDLE thread = ::OpenThread(THREAD_ALL_ACCESS, FALSE, te.th32ThreadID);
                        if(thread != NULL)
                        {
                            SuspendThread(thread);
                            CloseHandle(thread);
                        }
                    }
                }
                te.dwSize = sizeof(te);
            } while (Thread32Next(h, &te));
        }
        CloseHandle(h);    
    }
}






system