我试图在一个帖子中运行我的程序的一部分并获得一个不寻常的结果。
我已使用changes suggested by Remus的结果更新了此问题,但由于我仍然收到错误,我觉得问题仍然存在。
我已在dll中实现了功能,以便与一个供应商软件绑定。一切正常,直到我尝试在这个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大约是136k(我有一个单独的文件,其中一个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中?)以及补救措施可能是什么。当我在玩具程序中创建这个结构的实例时,没有问题。当我删除list变量时,程序只是在字符串声明
的其他地方崩溃了我现在对这方面的建议非常开放,如果我必须暂时删除线程的想法,尽管它不是特别实用。
谢谢,特别是那些再次阅读此内容的人:)
答案 0 :(得分:0)
使用CRT的线程(以及std::list
暗示CRT)需要使用_beginthreadex创建,如MSDN所述:
可执行文件中调用C运行时库(CRT)的线程 应该使用_beginthreadex和_endthreadex函数作为线程 管理而不是CreateThread和ExitThread;
不清楚你是如何开始你的线程的,但看起来你是在DllMain中这样做的,不建议这样做(见Does creating a thread from DllMain deadlock or doesn't it?)。
答案 1 :(得分:0)
在重新检查此处的注释和项目配置时,供应商提供的解决方案文件使用/ MTd进行调试,但我们正在构建DLL,因此我需要使用/ MDd,它会立即编译并正确运行。
对于荒谬的头部刮擦感到抱歉...