मेरे पास एक बहुत ही जटिल प्रोग्राम है जो असफल रहा है, और मैंने इसे बैच फ़ाइल और सी प्रोग्राम के साथ इस परीक्षण सेट में सरल बना दिया है।मैं विंडोज 7 में रिटर्न कोड का परीक्षण क्यों नहीं कर सकता?
मेरा सी प्रोग्राम बैच फ़ाइल में त्रुटि-रेखा को वापस करने के लिए ExitProcess का उपयोग करता है। कभी-कभी विंडोज 7 (माइक्रोसॉफ्ट विंडोज [संस्करण 6.1.7600]) पर, त्रुटि-रेखा का सही ढंग से व्याख्या नहीं किया जा रहा है।
मुझे लगता है कि यह हमेशा के लिए चलना चाहिए। विंडोज एक्सपी पर यह हमेशा के लिए चलाने के लिए प्रतीत होता है। दो अलग-अलग दोहरी कोर विंडोज 7 मशीनों (एक 64-बिट एक 32-बिट) पर यह कुछ मिनटों में विफल हो जाता है।
मैं कल्पना नहीं कर सकता कि मैं कुछ गलत कर रहा हूं, लेकिन यदि विंडोज 7 पर ExitProcess के बारे में कुछ मजाकिया है, तो मैंने सोचा कि मैं पूछूंगा। क्या यहां कुछ भी है जो मैंने अवैध तरीके से किया है? cmd.exe के लिए
बैच फ़ाइल test.bat:
@ECHO OFF
SET I=0
:pass
SET /A I=I+1
Title %I%
start/wait level250
if errorlevel 251 goto fail
if errorlevel 250 goto pass
:fail
कार्यक्रम level250.c:
#include "windows.h"
static volatile int Terminate = 0;
static unsigned __stdcall TestThread(void * unused)
{
Terminate = 1;
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
CreateThread(NULL, 0, TestThread, NULL, 0, NULL);
while (Terminate == 0) Sleep(1);
ExitProcess(250);
}
मेरे संकलक संस्करण और मंगलाचरण हैं:
Microsoft (R) 32-बिट सी/सी ++ ऑप्टिमाइज़िंग कंपाइलर संस्करण 12.00.8804 80x86
कॉपीराइट (सी) माइक्रोसॉफ्ट कॉर्प 1984-1998। सर्वाधिकार सुरक्षित।
सीएल/मीट्रिक टन level250.c
अन्य जानकारी: मैं भी JPSoft के TCC के तहत चल रहा करने की कोशिश की और अध्यक्ष एवं प्रबंध निदेशक का उपयोग कर के रूप में समान व्यवहार प्राप्त किया है। मैं एक सीधा .c प्रोग्राम का उपयोग कर रहा हूँ, नहीं .cpp। मुझे एक थ्रेडेड संस्करण में कोई असफलता दिखाई नहीं दे रही है। मैंने स्रोतों और बाइनरी को http://jcook.info/win7fail पर रखा और ज़िप फ़ाइल MD5 57 9F4FB15FC7C1EA454E30FDEF97C16B और सीआरसी 32 सी 27 सीबी 73 डी है।
EDIT सुझावों के बाद, मैंने परीक्षण केस को और बदल दिया है और अभी भी असफलताओं को देखा है। हमारे वास्तविक आवेदन में, सैकड़ों धागे हैं। कुछ धागे विभिन्न महत्वपूर्ण रिटर्न कोडों से बाहर निकलते हैं, कुछ हमेशा के लिए दौड़ते हैं, और कुछ ऑपरेटिंग सिस्टम कॉल या डीएलएस में लटकाए जाते हैं और मारने के लिए मुश्किल (यदि असंभव नहीं हैं) हैं।
#include "windows.h"
static unsigned __stdcall TestThread(void * unused)
{
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
CreateThread(NULL, 0, TestThread, NULL, 0, NULL);
return(250);
}
क्या आप ExitProcess() को कॉल करने से पहले इसे पूरा करने के बाद अपने धागे में शामिल होने की प्रतीक्षा नहीं कर रहे हैं? – IanNorton
आपको थ्रेड समाप्ति के लिए प्रतीक्षा करने के लिए व्यस्त लूप के बजाय WaitForSingleObject() का उपयोग करना चाहिए। इसके अलावा, ExitProcess() को सीधे कॉल करने के बजाय WinMain() से 250 वापस लौटें। WinMain() बाहर निकलने के बाद कंपाइलर का स्टार्टअप कोड ExitProcess() को कॉल करेगा। –
@IanNorton: मुझे विश्वास नहीं है कि धागे को समाप्त करने और/या शामिल होने के लिए प्रतीक्षा करना आवश्यक है। हमारे पूरे कार्यक्रम में कुछ धागे हैं जो या तो लटका I/O या सिस्टम कॉल या अन्य कारणों से समाप्त नहीं हो सकते हैं। क्या माइक्रोसॉफ्ट से कुछ दस्तावेज हैं जो आप मुझे इंगित कर सकते हैं कि धागे को फिर से जोड़ने के लिए आवश्यकताओं को दिखाता है? @ रेमी: हमारा वास्तविक कार्यक्रम कहीं अधिक जटिल है और प्रत्यक्ष परीक्षण का एक कारण है। जैसे-जैसे यह निकलता है, टर्मिनेट वैरिएबल के सभी उल्लेखों को हटाकर समस्या का समाधान नहीं होता है। यानी एक थ्रेड जो आसानी से लौटाता है और एक WinMain जो थ्रेड बनाता है तो बाहर निकलता है भी विफल रहता है। – piCookie