B BJ_QQ Unregistered / Unconfirmed GUEST, unregistred user! 2004-02-06 #1 在外部调用我定义的类,在我定义的类中含有一个回调函数,由于我的调用者是个多线程的,所以,我在定义回调函数的时候Static会产生问题,恳请各位大富翁们,能否给点什么建议,以便我能顺利解决这个问题,200分不多,要是能够解决问题另有重谢!!!
在外部调用我定义的类,在我定义的类中含有一个回调函数,由于我的调用者是个多线程的,所以,我在定义回调函数的时候Static会产生问题,恳请各位大富翁们,能否给点什么建议,以便我能顺利解决这个问题,200分不多,要是能够解决问题另有重谢!!!
C cnzhw007 Unregistered / Unconfirmed GUEST, unregistred user! 2004-02-06 #2 将回调函数改为递归函数,这样可以避免多线程调用的冲突!
A apw Unregistered / Unconfirmed GUEST, unregistred user! 2004-02-06 #3 在线程中定义如TNotifyEvent之类的句柄,创建线程时将回调函数传入。 回调函数内若访问共享资源,应考虚线程安全。 由于VCL不是线程安全的,线程中若使用与VCL相关的代码,应同步到主线程。 有些应用不能在子线程内进行,可以通过消息传递的方式(PostMessage而不是SendMessage)执行回调。 另:cnzhw007: 你知道什么是回调函数,什么是递归函数?
在线程中定义如TNotifyEvent之类的句柄,创建线程时将回调函数传入。 回调函数内若访问共享资源,应考虚线程安全。 由于VCL不是线程安全的,线程中若使用与VCL相关的代码,应同步到主线程。 有些应用不能在子线程内进行,可以通过消息传递的方式(PostMessage而不是SendMessage)执行回调。 另:cnzhw007: 你知道什么是回调函数,什么是递归函数?
B BJ_QQ Unregistered / Unconfirmed GUEST, unregistred user! 2004-02-06 #4 不好意思,我刚才忘了说了,该应用程序不仅基于windows,他采用的不是mfc,也不是用vcl,应该是应用STL,我是刚进入这个项目组,这套东西应该是在sun下边工作的。有些事情还是糊里糊涂的,问题的提出也有点含糊,有什么不清楚的我尽可能说清楚,。请各位帮帮忙了:)[]
不好意思,我刚才忘了说了,该应用程序不仅基于windows,他采用的不是mfc,也不是用vcl,应该是应用STL,我是刚进入这个项目组,这套东西应该是在sun下边工作的。有些事情还是糊里糊涂的,问题的提出也有点含糊,有什么不清楚的我尽可能说清楚,。请各位帮帮忙了:)[]
A apw Unregistered / Unconfirmed GUEST, unregistred user! 2004-02-06 #6 我在Linux下用C++做过多线程应用,回调采用函数指针传递,没什么问题。
W weiwei81123 Unregistered / Unconfirmed GUEST, unregistred user! 2004-02-06 #7 给回调函数(static)传一个参数,参数值是实例指针,通过它来调用实例函数(非static)
B BJ_QQ Unregistered / Unconfirmed GUEST, unregistred user! 2004-02-06 #8 楼上这个方法适用于多线程多实例呢?能不能具体点? 能不能有更对象化的设计思路?我听说可以用一个纯虚类,来实现?
A apw Unregistered / Unconfirmed GUEST, unregistred user! 2004-02-07 #9 采用纯虚类,主要是为了在实现端和应用端定义一个接口标准,实现端从纯虚类中继承,并实现基类中的方法,而应用端按纯虚里的类定义调用实现端完成功能. 楼主提出的方式,即是用要用传递类指针的方式实现回调. 对于多线程回调的应用可以按以下思路进行: 1.接口标准 class TCallbackInterface { public: virtual int foo() = 0; }; 2.被线程调用的模块 class TInterfaceImp : public TCallbackInterface { public: virtual int foo(); }; int TInterfaceImp::foo() { // 进入临界 // 完成功能 ....... // 退出临界 } 4.启动线程的模块 TInterfaceImp* Intf = new TInterfaceImp; //建立线程xxx .... // 传递回调接口 xxx->SetCallBackIntf(Intf); 3.线程 class TMyThread { private: TCallbackInterface *Intf; protected: intdo Callback(); public: void SetCallBackIntf(TCallbackInterface* intf); }; void TMyThread::SetCallBackIntf(TCallbackInterface* intf) { Intf = intf; } int TMyThread:oCallback() { int res = -1; try { if( Intf ) res = Intf->foo(); } catch(...) { } return res; }
采用纯虚类,主要是为了在实现端和应用端定义一个接口标准,实现端从纯虚类中继承,并实现基类中的方法,而应用端按纯虚里的类定义调用实现端完成功能. 楼主提出的方式,即是用要用传递类指针的方式实现回调. 对于多线程回调的应用可以按以下思路进行: 1.接口标准 class TCallbackInterface { public: virtual int foo() = 0; }; 2.被线程调用的模块 class TInterfaceImp : public TCallbackInterface { public: virtual int foo(); }; int TInterfaceImp::foo() { // 进入临界 // 完成功能 ....... // 退出临界 } 4.启动线程的模块 TInterfaceImp* Intf = new TInterfaceImp; //建立线程xxx .... // 传递回调接口 xxx->SetCallBackIntf(Intf); 3.线程 class TMyThread { private: TCallbackInterface *Intf; protected: intdo Callback(); public: void SetCallBackIntf(TCallbackInterface* intf); }; void TMyThread::SetCallBackIntf(TCallbackInterface* intf) { Intf = intf; } int TMyThread:oCallback() { int res = -1; try { if( Intf ) res = Intf->foo(); } catch(...) { } return res; }