在將項目遷移到帶有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