Я пытаюсь запустить часть своей программы в потоке и получаю необычный результат.
Я обновил этот вопрос с результатами изменений , предложенных 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?), И каким могло бы быть лекарство. Когда я создавал экземпляр этой структуры в моей игрушечной программе, проблем не было. Когда я удалил переменную списка, программа просто упала в другом месте, при объявлении строки
На данный момент я очень открыт для предложений, если мне придется, я пока исключу идею создания потоков, хотя это не особенно практично.
Спасибо, особенно тем, кто читает это снова:)