近日整理以前的工程,作了一个IndyThreadComponent控件的管理,为了在启动线程时执行不同的功能,要对线程的OnRun事件进行调整,因此想到用回调函输来处理;
1. 首先,先定义了一个与IndyThreadComponent控件OnRun事件相同的函数体
void __fastcall TMyForm::MyThrd(TIdThreadComponent *Sender)
{
EnterCriticalSection(&cs2);//进入临界区
... //这里是我要执行的代码
LeaveCriticalSection(&cs2);
((TIdThreadComponent *)Sender)->Active = false;
}
2. 然后定义一个回调函数
void TMyForm::CallThrd(TIdNotifyThreadComponentEvent func)
{
IndyThreadComponent1->OnRun = func; //IndyThreadComponent1是我的控件Name
.... 这里是我要执行的代码
}
3. 调用回调函数
...
CallThrd(MyThrd);
...
4.小结
需要注意的是这里回调函数的定义与普通的回调函数不同,因为事件的定义方式比较特殊。
已开始我将回调函数定义成这个样子
void TMyForm::CallThrd(void __fastcall func(TIdThreadComponent *Sender))
结果编译没问题,但运行类型不匹配,几经尝试最后成功了。具体的原理暂时还没弄明白,先记下来备查。