Friday, 15 June 2012

c++ - QTcpSocket - An invalid handle was specified when exting QRunnable -


इस स्निपेट में यह त्रुटि हुई:

  शून्य TCPConnectThread :: run () {m_socket = नया QTcpSocket (); m_socket- & gt; setSocketDescriptor (m_fd); m_socket- & gt; waitForReadyRead (10000); QString डेटा = m_socket- & gt; readAll (); m_socket- & gt; waitForDisconnected (); }   

एक छोटे से गहरे में:

  if (:: WSAIoctl (सॉकेट डिस्क्रिप्टर, फिशनरेड, और डमी, आकारफ (डमी), & amp; nbytes, Sizeof (nbytes), और आकार, लिखित, 0,0) == SOCKET_ERROR) & lt; -Exception यहाँ {WS_ERROR_DEBUG (WSAGetLastError ()); वापसी -1; }   

गहरा में:

  if (:: getsockopt (d-> सॉकेट डिस्क्रिप्टर, SOL_SOCKET, SO_ERROR, (चार *) और मान, & amp; ; ValueSize) == 0) & lt; -यहाँ   

अमान्य संभाल अपवाद चलाने विधि से निकलते समय हुआ।

यहां मैं कैसे m_socket मिलता है:

  m_socket = नया QTcpSocket (); M_socket- & gt; सेटसेटकेट डिस्क्रिप्टर (m_fd); // m_fd दूसरे धागे के दूसरे सॉकेट // के सॉकेट डिस्क्रिप्टर है   

यह धागा है जिसमें से m_fd है एकत्र: <प्री> शून्य टीसीपीएलस्टनरट्रेड :: ऑन न्यूकनेक्शन () {क्यूटीसीपीसॉकेट * क्लाइंटसॉकेट = एम_टीसीपीसर्वर-> gt; अगलापैडिंग कनेक्शन (); Int sockfd = clientSocket- & gt; सॉकेट डिस्क्रिप्टर (); M_connectThread = नया TCPConnectThread (sockfd); m_threadPool- & gt; शुरू (m_connectThread); }

अपवाद:

  manager_host.exe में 0x76edf9ea पर सबसे अधिक संभव अपवाद: 0xC0000008: एक अवैध संभाल निर्दिष्ट किया गया था   < P> मैं कैसे और कहां यह अमान्य संभाल सकता हूं?   

आप सॉकेट डिस्क्रिप्टर का उपयोग नहीं कर सकते एक QTcpSocket ऑब्जेक्ट अगर यह पहले से किसी अन्य QTcpSocket ऑब्जेक्ट द्वारा उपयोग किया जाता है एक बार यह निर्दिष्ट करने की कोई विधि भी नहीं है कि एक बार QTcpSocket

को असाइन किया गया है, भले ही आप स्पष्ट रूप से प्रारंभिक QTcpSocket का उपयोग न करें, अगर थ्रेड में एक इवेंट लूप है जो इसे बनाया गया था (जो शायद यहाँ मामला है), क्यूटी उसे उस धागे में मॉनिटर करेगा।

एक विकल्प के रूप में, आप कर सकते हैं:

    < Li> इसे QTcpSocket को nextPendingConnection का उपयोग करने के बजाय उसे निर्दिष्ट करने से पहले उस विवरण प्राप्त करने के लिए QTcpServer वर्ग को अपनी पद्धति को फिर से परिभाषित करने के लिए प्राप्त करें।
  • थ्रेड निर्माता के लिए पैरामीटर के रूप में सॉकेट डिस्क्रिप्टर के बजाय सीधे QTcpSocket से आपको nextPendingConnection से प्राप्त होता है, और इसे अन्य थ्रेड (देखें) पर ले जाएं:

      TCPConnectThread (QTcpSocket * सॉकेट): m_socket (सॉकेट) {m_socketâ ???? & gt; setParent (0); // ऑब्जेक्ट को दूसरे धागे में ले जाने के लिए आवश्यक है m_socket- & gt; MoveToThread (this); ...}   

    चलती को प्रारंभिक धागा से पूरा किया जाना है, पहले विकल्प को QRunnable के साथ करना आसान हो सकता है, क्योंकि आप शायद नहीं भविष्य में QThread का आसानी से उपयोग किया जा सकता है।

No comments:

Post a Comment