2010-12-22 29 views
1

我有一個問題在類A中執行一個線程,例如類A是類B的一個靜態成員在dll中。我正在使用Visual Studio 9並提升1.40。請考慮下面的代碼:從dll中的靜態成員進行線程化

mylib.h:

 

#include <boost/thread.hpp> 
#include <windows.h> 

#ifdef FOO_STATIC 
    #define FOO_API 
#else 
    #ifdef FOO_EXPORT 
    #define FOO_API __declspec(dllexport) 
    #else 
    #define FOO_API __declspec(dllimport) 
    #endif 
#endif 


class FOO_API foo{ 
    boost::thread* thrd; 
    public: 
    foo(); 
    ~foo(); 
    void do_work(); 
}; 

class FOO_API bar{ 
    static foo f; 
public: 
    static foo& instance(); 
}; 
 

mylib.cpp:

 

#include "mylib.h" 

foo::foo() 
{ 
    thrd = new boost::thread(boost::bind(&foo::do_work,this)); 
} 

foo::~foo(){ 
    thrd->join(); 
    delete thrd; 
} 

void foo::do_work(){ 
    printf("doing some works\n"); 
} 

foo& bar::instance(){return f;} 

foo bar::f; 
 
在可執行應用

,我有:

main.cpp中:

 

#include "mylib.h" 
void main(){ 
    bar::instance(); 
} 
 

如果我l墨水mylib靜態地可執行應用程序,它打印出「做一些工作」,而如果我動態鏈接它(DLL),它什麼都不做。

我真的很感激任何幫助。

+0

使用調試器。用/ MD編譯。 – 2010-12-22 19:17:28

回答

0

在線程完成之前,您的程序可能正在退出。您可能會嘗試等待bar::instance()呼叫,或加入main中的線程。還有一件事要嘗試在printf調用後刷新標準輸出。

+0

你說得對。我必須等待bar::instance()或加入main的線程。 – Arash 2010-12-22 20:39:43

0

從MSDN documentation

如果您的DLL與C 運行時庫(CRT),該條目由CRT提供 點調用 構造函數和析構聯 全球和靜態C++對象。 因此,這些限制(*)對於 DllMain也適用於構造函數和 析構函數和從它們調用 的任何代碼。

(*)限制包括與線程進行通信。

最好使全局變量成爲一個指針,並在專用的回調例程中構造和釋放對象。

另請參閱this有幫助所以回答。