में सफल सस्पेंड थ्रेड के बाद विफल रहता है मुझे विंडोज 7 में एक नमूना प्रोफाइलर पर एक अजीब समस्या का सामना करना पड़ रहा है (पिछले विंडोज ओएस पर AFAICT ऐसे कोई समस्या नहीं है, चाहे वे 32 या 64 बिट हों)।GetThreadContext विंडोज 7
प्रोफाइलर समय-समय पर SuspendThread
साथ एक धागा निलंबित करके काम करता है, फिर, GetThreadContext
साथ संदर्भ में दिखता है ResumeThread
लागू प्रक्रिया पुनः आरंभ करने से पहले। यह सब एक मल्टीमीडिया टाइमर के धागे के संदर्भ से किया जाता है (सटीकता के लिए, लगभग 1kHZ पर, जो प्री-विंडोज 7 ओएस पर आम तौर पर एक नगण्य प्रदर्शन जुर्माना लगाता है)।
विंडोज 7, और विंडोज 7 के तहत केवल, भले ही SuspendThread
(और ResumeThread
) सभी के लिए कॉल सफल होते हैं तो GetThreadContext
के लिए कॉल त्रुटि के साथ विफल:
एक बहुत ही उच्च इस संभावना को साथERROR_NOACCESS
998 (0x3E6)
Invalid access to memory location.
, हालांकि सभी नहीं समय।
कि मेरा मतलब है कि के लिए कुछ रूपरेखा चलाता है, सब कुछ के रूप में यह अन्य OSes (सभी GetThreadContext
कॉल सफल होगा) पर करता है काम करेंगे, लेकिन अन्य रनों के लिए, वे लगभग सभी (असफल हो जायेगी से बाहर हो सकता है एक दर्जन से बचाने के लिए, तक हजारों के दसियों)। यह वही पैरामीटर, वही पैरामीटर के साथ हो रहा है।
मैंने GetThreadContext
कॉल दोहराने के लिए अस्पष्ट रूप से समान दिखने वाले मुद्दों पर सुझावों का प्रयास किया है, और अधिक सफलता के साथ। मैंने को SuspendThread
और GetThreadContext
के बीच करने का भी प्रयास किया है, तो GetThreadContext
अधिक बार सफल होता है, हालांकि इसके परिणामस्वरूप कठोर मंदी होती है।
यह सुझाव देता है कि विंडोज 7 ओएस SuspendThread
से लौट रहा है, जबकि थ्रेड शायद अभी तक निलंबित नहीं किया गया है - हालांकि, अगर ऐसा है, तो मुझे नहीं पता कि निलंबन पर सही तरीके से इंतजार करना है या नहीं, मुझे लूपिंग धागा और तेज़ GetThreadContext
ऐसा नहीं करता है।
संपादित करें: 16 बाइट GetThreadContext
के लिए CONTEXT
संरचना के पते संरेखित के रूप में दान बार्टलेट ने सुझाव दिया चाल कर किया जा रहा है!
बहुत विशिष्ट दिखता है। शायद आपको समस्या का पता लगाने के लिए विंडोज़ का एक चेक बनाया जाना चाहिए? क्या आपने एमएसडीएन डेवलपर मंचों में इस समस्या का वर्णन किया था? या शायद सीधे एमएस पर एक बग फाइल करें। – ChristianWimmer
क्या आपने प्रक्रिया बनाते समय THREAD_ALL_ACCESS प्रॉपर्टी का उपयोग किया था? Http://msdn.microsoft.com/en-us/library/ms686769(v=vs.85).aspx देखें जो बताता है कि "THREAD_ALL_ACCESS ध्वज का मान Windows Server 2008 और Windows Vista पर बढ़ गया" ... –
CONTEXT को WinNT.h में "DECLSPEC_ALIGN (16)" के साथ घोषित किया गया है, हो सकता है कि यह एक संरेखण मुद्दा हो? –