Завершение потока рано с кодом 255 - PullRequest
2 голосов
/ 13 июля 2011

Я пытаюсь запустить часть своей программы в потоке и получаю необычный результат.

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

Я реализовал функциональность в DLL, чтобы связать его с частью программного обеспечения вендора. Все работает, пока я не попытаюсь создать поток внутри этой библиотеки.

Вот соответствующий раздел библиотеки DLL:

extern "C" {
__declspec(dllexport) void __cdecl ccEntryOnEvent(WORD event);
}

для определения функции, которую вызывает программное обеспечение поставщика, затем:

using namespace std;

HANDLE LEETT_Thread = NULL;
static bool run_LEETT = true;
unsigned threadID;
void *lpParam;

int RunLEETTThread ( void ) {
    LEETT_Thread = (HANDLE)_beginthreadex( NULL, 0, LEETT_Main, lpParam, 0 , &threadID );
    //LEETT_Thread = CreateThread ( NULL, 0, LEETT_Main, lpParam, 0 , NULL );

    if ( LEETT_Thread == NULL ) 
        ErrorExit ( _T("Unable to start translator thread") );

    run_LEETT = false;  // We only wish to create the thread a single time.
    return 0;
}

extern "C" void __cdecl ccEntryOnEvent(WORD event ) {
    switch (event) {
    case E_START:
        if ( run_LEETT ) {
            RunLEETTThread ();
            MessageText ( "Running LEETT Thread" );
        }
        break;
    }

    WaitForSingleObject( LEETT_Thread ,INFINITE);
    return;
}  

Функция объявлена ​​как

unsigned __stdcall LEETT_Main ( void* lpParam ) {

LEETT_Main составляет около 136 КБ при компиляции в виде отдельного исполняемого файла без оптимизации (у меня есть отдельный файл с main (), который вызывает ту же функцию, что и myFunc).

Перед изменением способа вызова потока программа аварийно завершит работу при объявлении структуры, содержащей список std :: list, показанный здесь:

struct stateFlags {
    bool inComment;    // multiline comments bypass parsing, but not line numbering
    // Line preconditions
    bool MCodeSeen;  // only 1 m code per block allowed
    bool GCodeSeen;  // only 1 g code per block allowed

    std::list <int> gotos; // a list of the destination line numbers
};

Теперь происходит сбой по команде _beginthreadex, трассировка показывает это

    /*
     * Allocate and initialize a per-thread data structure for the to-
     * be-created thread.
     */
    if ( (ptd = (_ptiddata)_calloc_crt(1, sizeof(struct _tiddata))) == NULL )
            goto error_return;

Проходя через это, я увидел ошибку 252 (плохой ptr) и в конечном итоге 255 (ошибка времени выполнения).

Мне интересно, сталкивался ли кто-нибудь с подобным поведением, создающим потоки (в dll?), И каким могло бы быть лекарство. Когда я создавал экземпляр этой структуры в моей игрушечной программе, проблем не было. Когда я удалил переменную списка, программа просто упала в другом месте, при объявлении строки

На данный момент я очень открыт для предложений, если мне придется, я пока исключу идею создания потоков, хотя это не особенно практично.

Спасибо, особенно тем, кто читает это снова:)

Ответы [ 2 ]

0 голосов
/ 13 июля 2011

При перепроверке комментариев и конфигурации проекта, файл решения, предоставленный поставщиком, использует / MTd для отладки, но мы собираем DLL, поэтому мне нужно было использовать / MDd, который сразу компилируется и работает правильно.

Извините за нелепый скребок головы ...

0 голосов
/ 13 июля 2011

Потоки, использующие CRT (а std::list подразумевает CRT), должны быть созданы с _beginthreadex , как описано в MSDN :

Потокв исполняемом файле, который вызывает библиотеку времени выполнения C (CRT), следует использовать функции _beginthreadex и _endthreadex для управления потоками, а не CreateThread и ExitThread;

Непонятно, как запустить поток, нокажется, что вы делаете это в DllMain, что не рекомендуется (см. Создает ли поток из тупика DllMain или нет? ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...