2011-08-17 9 views
6

मैं बस सोच रहा था कि यह संभव है (और यदि ऐसा है, तो कैसे) C++ (विंडोज) में थ्रेड के वापसी मूल्य प्राप्त करने के लिए। मेरे पास कई धागे हैं, और मैं उन पर WaitForMultipleObjects(...) का उपयोग करता हूं। यह तब तक इंतजार करता है जब तक धागा नहीं किया जाता है, और कहा थ्रेड की अनुक्रमणिका देता है, और सब ठीक है। हालांकि, मैं अपने हैंडल का उपयोग करके समाप्त धागे के वापसी मूल्य को प्राप्त करने में सक्षम होना चाहता हूं।आप विंडोज थ्रेड का रिटर्न वैल्यू कैसे प्राप्त कर सकते हैं?

उदाहरण के लिए:

DWORD WINAPI Thread1(void *parameter){ 
    ... 
    if(...) return 0; 
    else return -1; 
} 

DWORD WINAPI Thread2(void *parameter){ 
    ... 
    if(...) return 1; 
    else return 0; 
} 

int main(){ 
    HANDLE t1 = CreateThread(0, 0, Thread1, NULL, 0, 0); 
    HANDLE t2 = CreateThread(0, 0, Thread2, NULL, 0, 0); 
    HANDLE *threads = new HANDLE[2]; 
    threads[0] = t1; 
    threads[1] = t2; 
    int result = WaitForMultipleObjects(2, threads, false, INFINITE); 
    if(result == 0){ 
     //get the threads value here: 
     int retVal = SomeFunction(t1); //What is SomeFunction? 
    } 
    ... 
} 

मैं GetExitCodeThread(thread) उपयोग करने के लिए कोशिश की है, लेकिन मैं के रूप में यह हमेशा मुझे एक बहुत ही अजीब पूर्णांक देता है यह एक ऐसी प्रणाली से बाहर निकलें कोड लौटाता है, यह सोचते हैं रहा हूँ। क्या किसी को रास्ता, या कामकाज पता है?

+3

मैंने हमेशा GetExitCodeThread का उपयोग किया है। क्या आप वाकई इसका सही इस्तेमाल कर रहे हैं? यह एक थ्रेड हैंडल और एक पॉइंटर को DWORD पर ले जाता है और GetExitCodeThread (_not_ थ्रेड का वापसी मान) की सफलता देता है। –

+0

आपका प्रश्न मेरा उत्तर है :) – Koying

उत्तर

11

GetExitCodeThread सही कार्य है हो सकता है की जरूरत है। एमएसडीएन विवरण यह है कि यह क्या करता है:

यह फ़ंक्शन तुरंत लौटाता है। यदि निर्दिष्ट थ्रेड समाप्त नहीं हुआ है और फ़ंक्शन सफल होता है, तो लौटाई गई स्थिति STILL_ACTIVE है। धागा समाप्त कर दिया है और समारोह सफल होता है, स्थिति लौटा निम्न मानों में से एक है, तो:

  • बाहर निकलने ExitThread या TerminateThread समारोह में निर्दिष्ट मान।
  • थ्रेड फ़ंक्शन से वापसी मूल्य।
  • धागे की प्रक्रिया का निकास मूल्य।
+2

'GetExitCodeThread (t1, और retVal)' और 42 9 4 9 672 9 5 (एक डीडब्ल्यूओआर होने से retval) लौटा दिया। धागे में वास्तविक वापसी मूल्य -1 था। मैंने बस इनट्स को नकारात्मकों के लिए वापस ले लिया। आह ... – Sefu

1

आप मूल्यों के लिए STILL_ACTIVE जांचने के लिए इन धागों में से एक अभी भी सक्रिय

3

सबसे प्रोग्रामर के साथ समस्या यह है कि वे चेतावनी संकलक करने के लिए ध्यान देना नहीं है। स्तर 4 (/ W4) में संकलक चेतावनी निम्नलिखित उत्पादन जब कि DWORD लौटा रहा है एक समारोह से लौट रहे -1:

warning C4245: 'return' : conversion from 'int' to 'DWORD', signed/unsigned mismatch

0

आप std::future का उपयोग कर सी ++ 11 के थ्रेड अवधारणाओं का प्रयोग कर सकते हैं।
नीचे एक उदाहरण देखें।

int ReturnFrmThread() { 
    return 100; 
} 

int main() { 
    std::future<int> GetRetVal= std::async(ReturnFrmThread); // Execution of ReturnFrmThread starts 
    int answer = GetAnAnswer.get(); // gets value as 100; 
    // Waits until ReturnFrmThread has finished 
} 
संबंधित मुद्दे