Сбои приложения при выходе из потока - C ++ - PullRequest
0 голосов
/ 30 ноября 2010

Мое приложение падает при выходе из функции потока. Вот как инициализируется мой поток:

LPTHREAD_START_ROUTINE pThreadStart = (LPTHREAD_START_ROUTINE)NotifyWindowThreadFn;
void * pvThreadData = reinterpret_cast<void *>(_pobjSerialPort);

// Create the exit notify window thread event handle.
_hNotifyWindowThreadExitEvent = ::CreateEvent(
    NULL,                           // No security
    TRUE,                           // Create a manual-reset event object
    FALSE,                          // Initial state is non-signaled
    NULL                            // No name specified
    );

if ( _hNotifyWindowThreadExitEvent == NULL )
{
    TRACE(_T("CreateNotifyWindow : Failed to get a handle for the exit message-only window event.\r\n\tError: %d\r\n\tFile: %s\r\n\tLine: %d\r\n"), ::GetLastError(), __WFILE__, __LINE__);
    return ::GetLastError();
}

// Create the notify window thread to begin execution on its own.
_hNotifyWindowThread = ::CreateThread(
    NULL,                           // No security attributes.
    0,                              // Use default initial stack size.
    pThreadStart,                   // Function to execute in new thread.
    pvThreadData,                   // Thread parameters.
    0,                              // Use default creation settings.
    NULL                            // Thread ID is not needed.
    );

if ( _hNotifyWindowThread == NULL )
{
    TRACE(_T("CreateNotifyWindow : Failed to create handle for message-only window thread.\r\n\tError: %d\r\n\tFile: %s\r\n\tLine: %d\r\n"), ::GetLastError(), __WFILE__, __LINE__);
    return ::GetLastError();
}

Это часть моей функции потока, которая выполняется:

DWORD NotifyWindowThreadFn( void * pParam )
{
    static CNotifyWindow * pobjNotifyWindow = NULL;
    CSerialPort * pobjSerialPort = reinterpret_cast<CSerialPort *>(pParam);

    // Create notify window to handle surprize removal/insertion events...
    try
    {
        pobjNotifyWindow = new CNotifyWindow();
    }
    catch ( DWORD error )
    {
        return error;                // 1. PC gets here
    }
    catch ( long error )
    {
        return error;
    }
    catch ( ... )
    {
        return ERROR_CANNOT_MAKE;
    }

    /* Other stuff that is not executed due to return. */

}                                     // 2. PC then gets here

При сбое приложения Visual Studio выдает мне следующее сообщение об ошибке:

Windows запустила точку останова в CppTestConsole.exe.

Это может быть связано с повреждением кучи, что указывает на ошибку в CppTestConsole.exe или любой из загруженных им библиотек DLL.

Это также может быть связано с тем, что пользователь нажимает клавишу F12, когда фокус находится у CppTestConsole.exe.

В окне вывода может быть больше диагностической информации.

В окне вывода нет ничего особенно полезного. Только ...

Поток NotifyWindowThreadFn (0x414) завершился с кодом 0 (0x0).

Тогда это показывает, что куча DLL выгружена. Когда я нажимаю кнопку Break, ПК находится в конце _CrtIsValidHeapPointer в dbgheap.c. У кого-нибудь есть идеи относительно того, почему мое приложение падает при выходе из потока? Разве я не должен возвращаться напрямую из потоковой функции? Спасибо.

Ответы [ 3 ]

3 голосов
/ 30 ноября 2010

Я могу ошибаться, но похоже, что вы пытаетесь создать окно из рабочего потока. Не делай этого. Для работы Windows необходим насос сообщений, а в вашем приложении только один насос сообщений - он находится в главном потоке.

1 голос
/ 30 ноября 2010

Вы должны объявить и определить свою функцию как: DWORD WINAPI NotifyWindowThreadFn (void * pParam)

0 голосов
/ 30 ноября 2010

Попробуйте использовать _beginthreadex вместо CreateThread:

Поток в исполняемом файле, который вызывает библиотеку времени выполнения C (CRT), должен использовать функции _beginthreadex и _endthreadex для потокауправление, а не CreateThread и ExitThread;это требует использования многопоточной версии CRT.Если поток, созданный с помощью CreateThread, вызывает CRT, CRT может завершить процесс в условиях нехватки памяти.

...