2009-06-17 10 views
14

मैं यह देखने के लिए कैसे जांचूं कि Win32 थ्रेड चल रहा है या निलंबित स्थिति में?जांचें कि क्या एक Win32 थ्रेड चल रहा है या निलंबित स्थिति में

मुझे कोई Win32 API नहीं मिल रहा है जो थ्रेड की स्थिति देता है। तो मैं धागा राज्य कैसे प्राप्त करूं?

उत्तर

13

मुझे लगता है कि - मूल रूप से - क्योंकि किसी भी एपीआई कि इस जानकारी प्रदान की भ्रामक और बेकार हो सकता है इस जानकारी प्रदान नहीं किया गया।

दो संभावित मामलों पर विचार करें - वर्तमान धागे ने थ्रेड-ब्याज को निलंबित कर दिया है। वर्तमान धागे में कोड निलंबित राज्य के बारे में जानता है और इसे साझा करने में सक्षम होना चाहिए ताकि कर्नेल टीम को एपीआई जोड़ने की आवश्यकता न हो।

2 मामले, प्रणाली में कुछ अन्य/एक 3 धागा ब्याज की धागा निलंबित (और जो धागा था कि ट्रैक करने के लिए कोई रास्ता नहीं) किया है। अब आपके पास दौड़ की स्थिति है - कि अन्य थ्रेड किसी भी समय - ब्याज के धागे को असुरक्षित कर सकता है और एपीआई से प्राप्त जानकारी बेकार है - आपके पास एक मान है कि थ्रेड को वास्तव में निलंबित कर दिया गया है, न कि।

कहानी का नैतिक - अगर आप को पता है कि एक धागा निलंबित कर दिया है चाहते हैं - यह निलंबित: SuspendThread से वापसी मान धागा के पिछले गिनती निलंबन है। और अब आप कुछ उपयोगी जानते हैं - धागा था और अभी भी निलंबित कर दिया गया है - जो उपयोगी है। या यह नहीं था (लेकिन अब है) निलंबित कर दिया गया था। किसी भी तरह से, धागे की स्थिति अब निश्चित रूप से ज्ञात है ताकि आप सिद्धांत में कुछ बुद्धिमान विकल्प बना सकें - चाहे फिर से शुरू करें या इसे निलंबित रखें। - यह सही नहीं है

DWORD GetThreadSuspendCount(HANDLE hThread) { 
    DWORD dwSuspendCount = SuspendThread(hThread); 
    ResumeThread(hThread); 
    return dwSuspendCount; 
} 

लेकिन, के रूप में पहले ही कहा:

+1

हाँ - थ्रेड निलंबन स्थिति से पूछताछ करने का कोई भी प्रयास स्वाभाविक रूप से रासी –

+7

होने के लिए "निलंबित" और "चलने" से परे थ्रेड राज्य हैं। मुझे लगता है कि यह अधिक संभावना है कि ओपी को यह जानने में दिलचस्पी है कि कौन से धागे अवरुद्ध हैं। किसी भी मामले में, दौड़ की स्थिति के बारे में आपका बिंदु एक अच्छा है। यदि धागे की स्थिति पाने का कोई तरीका है, तो इसका उपयोग केवल सूचना के उद्देश्यों के लिए किया जाना चाहिए। नियंत्रण प्रवाह के लिए इसका उपयोग करने का कोई भी प्रयास चोट की दुनिया का कारण बन जाएगा। –

+0

बिल्कुल - निलंबित या निलंबित नहीं आमतौर पर ब्याज की नहीं है। एक सिंक्रनाइज़ेशन सिग्नल पर चल रहा है या इंतजार कर रहा है .... जो आमतौर पर ब्याज की बात है, और यह स्पष्ट रूप से कुछ है जिसे डिबगर्स और टूल्स जैसे निष्पादन मॉनीटर सतह के रूप में सटीक रूप से निर्धारित किया जा सकता है। इसके अलावा एक उचित रूप से लिखित आवेदन में, थ्रेड * डीबगर के तहत चलने तक कभी भी निलंबित नहीं किए जाएंगे। – Deltics

0

दुर्भाग्य से आप नहीं करते हैं। अपने कोड के आधार पर, आप अनुमान लगा सकते हैं (जब भी आप किसी कर्नेल ऑब्जेक्ट पर प्रतीक्षा करते हैं तो ध्वज सेट करके) लेकिन ध्यान रखें कि थ्रेड हमेशा ओएस या लाइब्रेरी कॉल के अंदर अवरुद्ध हो सकता है और आप इसके बारे में नहीं जानते।

1

विंडोज 7 में, आप QueryUmsThreadInformation उपयोग कर सकते हैं। (यूएमएस उपयोगकर्ता मोड शेड्यूलिंग के लिए खड़ा है)।

UmsThreadIsSuspended के लिए here देखें।

+2

न्यूनतम ग्राहक आवश्यकता: विंडोज 7 (64-बिट केवल) –

+0

प्री विंडोज 7 के लिए, मुझे आश्चर्य है कि SuspendThread पहले से निलंबित थ्रेड के लिए क्या देता है। हो सकता है कि आप अस्थायी रूप से निलंबित/फिर से शुरू करने और वापसी मूल्यों की जांच करके इस तरह की जांच कर सकें। बस एक विचार, काम नहीं कर सकता है। –

2

डब्ल्यूएमआई Win32_Thread कक्षा में ThreadState संपत्ति है, जहां 5: "निलंबित अवरुद्ध" और 6: निलंबित तैयार है।

आप थ्रेड के आईडी की जरूरत है सही उदाहरण सीधे प्राप्त करने के लिए होगा (WMI वस्तु के हैंडल संपत्ति धागा आईडी है)।

संपादित करें: इस PowerShell क्वेरी को देखते हुए:

gwmi win32_thread | group ThreadState 

देता

 
Count Name Group 
----- ---- ----- 
    6 2  {, , , ...} 
    966 5  {, , , ...} 

WMI Win32 को "निलंबित" का एक अलग परिभाषा है।

1

आप धागा मिल सकता है इस तरह के कोड के साथ गिनती रोक देते हैं। इसके अलावा, धागे को निलंबित करना बुरा है।

+2

बस एक राज्य को प्राप्त करने के लिए थ्रेड को निलंबित करने का एक बहुत ही बुरा विचार! धागा बहुत व्यस्त है तो क्या प्रदर्शन होगा? – Elmue

0

मुझे लगता है कि यहां राज्य में जाना जाता है के रूप में

  • तो धागा धागा proc में है, कुछ प्रसंस्करण या
  • घटना

के लिए प्रतीक्षा की जा रही इस का उपयोग करते हुए का ध्यान रखा जा सकता है कर वेरिएबल जो बता सकता है कि यदि कोई थ्रेड वास्तव में चल रहा है या घटना होने का इंतजार कर रहा है।

ये परिदृश्य थ्रेडपूल पर विचार करते समय, कुछ एन धागे होने और प्रत्येक थ्रेड चलने की स्थिति के आधार पर दिखाई देते हैं, कार्यों को निष्क्रिय धागे को सौंपा जा सकता है।

3

आप SystemProcessesAndThreadsInformation (पूर्णांक मान 5) के मान के साथ NtQuerySystemInformation() को कॉल करके यह जानकारी प्राप्त कर सकते हैं।

यदि आप इस जानकारी के साथ क्या कर सकते हैं इसका एक उदाहरण चाहते हैं तो Thread Status Monitor पर एक नज़र डालें।

+0

यह उत्तर सही है, लेकिन कोड गायब है। इस एपीआई का उपयोग करना आसान नहीं है। मैंने यहां एक वर्किंग क्लास पोस्ट किया: http://stackoverflow.com/questions/22949725/how-to-get-thread-state-eg-suspended-memory-cpu-usage-start-time-priori – Elmue

2

हालांकि यह दस्तावेज नहीं है - हालांकि यह IMHO होना चाहिए, अगर आप WaitForSingleObject को कॉल करते हैं, तो यह थ्रेड निलंबित होने पर WAIT_ABANDONED वापस आ जाएगा। इसके अलावा, अगर एक धागा समाप्त कर दिया गया है, तो इसका हैंडल एक संकेतित राज्य में होगा।

जब कोई आपके प्रश्नों का उत्तर देता है तो आपको अपने प्रश्नों का उत्तर क्यों नहीं देना चाहिए ... या पर सवाल उठाना शुरू होता है आप इसे करना चाहते हैं। जब कोई व्यक्ति Google पर यह प्रश्न पाता है, तो के कारण समान नहीं हैं और इस प्रकार उत्तर स्वयं को किसी और के लिए बेकार बना देगा।

+0

बस परीक्षण किया गया और ऐसा कोई नहीं चीज़। यह चल रहे और निलंबित मोड दोनों में 'WAIT_TIMEOUT' देता है। – CodeAngry

0

हाँ: थ्रेड स्थिति प्राप्त करना और यह निर्धारित करना संभव है कि यह निलंबित हो गया है या नहीं।

और नहीं: आपको ऐसा करने के लिए विंडोज 7 की आवश्यकता नहीं है।

मैं यहाँ मेरी श्रमिक वर्ग प्रकाशित Stackoverflow पर: How to get thread state (e.g. suspended), memory + CPU usage, start time, priority, etc

इस वर्ग Windows 2000 या उच्चतर की आवश्यकता है।

संबंधित मुद्दे