线程启动时通知对象
我有一个对象A,当某个线程启动或死亡时应该通知对象(A :: Notify()方法)。
可以说,这个线程动态加载我的一些DLL文件(我可以写它)。
我相信我应该写这个DLL的dllMain函数,但是我不知道如何从这个函数中获得对A对象的引用,所以我可以运行它的Notify()方法。
有什么想法?线程启动时通知对象
将A::Notify()
作为静态方法可以吗? 否则,Singleton
方法可能会达到目的。
所以如果我明白你写的,在你的主程序中你有一个类A的实例。当你的主程序加载某些dll时,你希望它为该实例调用A :: Notify?
据我所知,没有办法将其他参数传递给LoadLibrary。
如果A :: Notify可以是静态的,或者A是一个单身,从exe中导出一个“NotifyA”方法,然后让dll调用LoadLibrary(“yourexe”),GetProcAddress获取NotifyA的地址然后你可以打电话。 (是exe文件可以导出方法,如DLL文件!)
第二个选项是编写您自己的LoadLibrary,该DLL主后调用第二个方法,如
HMODULE MyLoadLibrary(string dll, A *a)
{
HMODULE module = LoadLibrary(dll.c_str())
void (call*)(A*) = void (*)(A*)GetProcAddress(module, "Init");
call(a);
return module;
}
然后DLL的初始化方法可以存储稍后的实例。
我认为A对象不在DLL中,不是吗? – neuro 2009-08-10 09:55:24
DLL在每个进程中加载一次。加载完成后,只要在进程中创建线程,就会自动调用它的DllMain。假设是一个全局变量,你可以做到以下几点:
- 你第一次加载DLL后,调用导出函数将在DLL中的全球指针设置为
- 每当DllMain中被调用,原因是线程连接,通过您在DLL中的指针调用A.
另一个选择是在你的exe文件中启动一个消息循环,并将它的线程ID传递给DLL。然后,每当一个线程连接到DLL,就会向消息循环发送一条消息,其中包含创建的线程的详细信息。这是一个稍微复杂一些的解决方案,但它可以节省您使DLL熟悉A类的需求。
更精确。它似乎读取您的问题,“通知”部分是独立于dll加载。如果这是真的,你只需要让你的线程类调用A :: notify()(你给它一个A:DIP的引用)然后加载你的DLL。 – neuro 2009-08-10 10:00:05