在将项目迁移到带有msvc110的C++ 11标准的过程中,不幸的是,在dll上使用的线程变量与我的boost版本有所不同。C++ 11线程vs升级线程
所以,最初这是在msvc90上工作,基本上Dll调用一个线程创建的InitDll。 该线程基本上作为一个监听程序以及dll的主线程。 现在,当我创建线程时,它挂起并不执行任何操作,甚至不执行用于初始化线程的函数。
你能帮我解释我怎么能得到与升压版相同的行为?
编辑:CODE
很抱歉,无法回复的评论
应用程序使用记录器通过一个DLL的代码。 要在一个非常简单的控制台应用程序使用记录是这样的
#include <Somewhere/Logger.h>
int main()
{
COOL_LOGGER("Here we go logging on console!");
return 0;
}
我们可以对代码的编写方式(从演示我提到拍摄)讨论,但如何初始化DLL和线程是:
#include "Logger.h"
#ifdef _WIN32
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
TheLog::InitLog();
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
#endif
#include <thread>
void InitLog()
{
// Do the init taken from library demos
std::thread m_thread(LogListener);
}
void LogListener()
{
while(!bAppEnd)
{
std::cin>>str;
// change log behavior according to the user input
}
}
// to stop the thread when shutting down
void EndLog()
{
// retrieve thread thought id or some other way
thread.join();
}
你应该发布一些代码。但是,这听起来像你可能在'DllMain()'中执行这个init。在DllMain()中执行重要的工作是一项非常危险的工作。请参阅文档的注释部分:http://msdn.microsoft.com/en-us/library/ms682583.aspx和http://blogs.msdn.com/b/oldnewthing/archive/2004/01/27/ 63401.aspx或http://blogs.msdn.com/b/oldnewthing/archive/2004/01/28/63880.aspx – 2013-02-18 18:26:20
谢谢Micheal,非常真实。我读过关于在DllMain上做些花哨的东西,不管我在这里是否真的发明过轮子。我只是将代码作为日志库的示例dll_and_exe的参考http://torjo.com/log2/doc/html/index.html – notNullGothik 2013-02-18 22:29:32
自从我在前面实现它之后,没有改变任何特定行为,它迄今为止工作很好。你会推荐我初始化图书馆的正确方法吗?我记得有点挣扎,试图从DLLMain中删除init并将它调用到其他地方,如果我记得确切的问题,会发布更多。 – notNullGothik 2013-02-18 22:32:03