我有一个C静态库,
回调定义:
typedef void (*HandleEvents) (enum events eventID, int msgSize, char *msg);
库中的一个函数:
int init(HandleEvents _handleEvents)
另一个在VS中开发的C ++ GUI。它链接了这个静态lib并调用了lib的 init 函数,给出了一个函数指针。
的init(&安培; CGateway :: handleEventsFunc);
其中 CGateway :: handleEventsFunc 是一个静态类函数。
在静态lib中的一个线程中调用C ++ GUI的这个回调。但我得到了堆腐败的错误。
总之,有2个线程,一个在静态库中,一个在主GUI应用程序中。静态库调用Main GUI的类函数。
那么在一个线程中调用回调函数的正确方法是什么?
答案 0 :(得分:1)
[关于多个堆的错误陈述,如Adisak所指出的,已删除]
要检查的一件事是,您没有从工作线程做任何与GUI相关的事情。访问窗口只能从创建它们的主线程安全。如果您必须更新GUI内容,则必须使用PostMessage()
来解耦。
答案 1 :(得分:0)
确保对任何可由一个线程修改并由另一个线程使用(读取或修改)的变量使用互斥或其他形式的线程保护。
在多线程代码中,堆损坏通常是代码的一种症状,它不是线程安全的访问内存。