CWinThread - SuspendThread schlägt fehl

19/09/2012 - 17:48 von Alexander Sailer | Report spam
Hallo NG,

ich habe leider nie viel mit Threads gearbeitet, muss aber jetzt geerbten Code warten. Ich habe immense Probleme mit einem Thread der Klasse CWinThread. Im Code werden mehrere Datenblöcke an eine Hardware transferiert und geholt, so dass der Code zum Teil mit CWinThread::SuspendThread arbeitet.

Ich arbeite mit VS2008 und MFC, die darin enthalten ist.

<Code>
if(this->m_pSendThread){
if(HANDLE(this->m_pSendThread)){ //bereits geàndert von this->m_pSendThread->m_hThread
DWORD dwRet = this->m_pSendThread->SuspendThread(); //An dieser Stelle stürzt meine App ab[1]
}
else{
TRACE(_T("Kein valider HANDLE auf den Thread vorhanden!"));
ASSERT(FALSE);
}
}
</Code>

Führt z. T. zu einem Fehler in

<afxwin2.inl>
...
_AFXWIN_INLINE DWORD CWinThread::SuspendThread()
{ ASSERT(m_hThread != NULL); return ::SuspendThread(m_hThread); }
...
</afxwin2.inl>

Wie es aussieht sind noch mehr Teile meines CWinThreadObjects betroffen:

<Daten des Objects>
this 0x048a2f18 {CWinThread h=??? proc=???} CWinThread * const
+{CCmdTarget} CCmdTarget
- classCWinThread {"CWinThread"} CRuntimeClass
|-+ m_lpszClassName 0x785f4d30 "CWinThread" const char *
| m_nObjectSize 0x00000044 int
| m_wSchema 0x0000ffff unsigned int
| m_pfnCreateObject 0x00000000 CObject * (void)*
| m_pfnGetBaseClass 0x786771e0 CWnd::_GetBaseClass(void) CRuntimeClass * (void)*
|-+ m_pNextClass 0x00000000 {???} CRuntimeClass *
|-+ m_pClassInit 0x00000000 const AFX_CLASSINIT *
m_pMainWnd CXX0030: Error: expression cannot be evaluated
m_pActiveWnd CXX0030: Error: expression cannot be evaluated
m_bAutoDelete CXX0030: Error: expression cannot be evaluated
m_hThread CXX0030: Error: expression cannot be evaluated
m_nThreadID CXX0030: Error: expression cannot be evaluated
m_pThreadParams CXX0030: Error: expression cannot be evaluated
m_pfnThreadProc CXX0030: Error: expression cannot be evaluated
m_lpfnOleTermOrFreeLib CXX0030: Error: expression cannot be evaluated
m_pMessageFilter CXX0030: Error: expression cannot be evaluated
</Daten des Objects>


[1] Unhandled exception at 0x787e15cc (mfc90d.dll) in BS350D.exe
0xC0000005: Access violation reading location 0x049f9acc (dies ist die Adresse von "this->m_pSendThread->m_hThread")

Im Voraus vielen Dank für eure Bemühungen
Alex
 

Lesen sie die antworten

#1 Jochen Arndt
20/09/2012 - 09:16 | Warnen spam
Am 19.09.2012 17:48, schrieb Alexander Sailer:
ich habe leider nie viel mit Threads gearbeitet, muss aber jetzt geerbten Code warten. Ich habe immense Probleme mit einem Thread der Klasse CWinThread. Im Code werden mehrere Datenblöcke an eine Hardware transferiert und geholt, so dass der Code zum Teil mit CWinThread::SuspendThread arbeitet.

Ich arbeite mit VS2008 und MFC, die darin enthalten ist.

<Code>
if(this->m_pSendThread){
if(HANDLE(this->m_pSendThread)){ //bereits geàndert von this->m_pSendThread->m_hThread
DWORD dwRet = this->m_pSendThread->SuspendThread(); //An dieser Stelle stürzt meine App ab[1]
}
else{
TRACE(_T("Kein valider HANDLE auf den Thread vorhanden!"));
ASSERT(FALSE);
}
}
</Code>



Der HANDLE() operator gibt NULL zurück, wenn das Objekt
this->m_pSendThread NULL ist. Anderenfalls wird m_hThread zurückgegeben.
Der Null Check ist hier unnötig, da er schon durch die erste if
Bedingung erfolgte. Wichtiger ist aber, dass ein ungültiges Handle nicht
durch NULL dargestellt wird, sondern durch INVALID_HANDLE_VALUE (-1)!

Mit zusàtzlicher Überprüfung, ob der Thread schon beendet wurde,
solltest du etwas in dieser Art verwenden:

if(this->m_pSendThread){
if(this->m_pSendThread->m_hThread != INVALID_HANDLE_VALUE){
DWORD dwExitCode;
if(::GetExitCodeThread(this->m_pSendThread->m_hThread,
&dwExitCode)){
if(STILL_ACTIVE == dwExitCode)
dwRet = this->m_pSendThread->SuspendThread();
else
TRACE("Thread not active!");
}
}
else
TRACE("GetExitCodeThread() failed with %d",
::GetLastError());
}
else{
TRACE(_T("Kein valider HANDLE auf den Thread vorhanden!"));
ASSERT(FALSE);
}
}

Bei der Verwendung von STILL_ACTIVE muss noch beachtet werden, dass der
Thread diesen Wert (0x103) nicht zurückgeben darf.

Joe

Ähnliche fragen