TimeCallBack停止的问题

以前在学习多线程的时候看过这个东西,玩的时候也没出问题,这次出问题了,不知道为什么。

查了msdn说是调用TimeCallBack的Timer对象是由当前进程的ThreadPool托管,一旦它被GC回收,就完蛋了。

给出的方法是让当前线程停止或者等待Timer的结束

Cnblogs的相关文章:C#多线程学习(五) 多线程的自动管理(定时器)

我的做法是新建一个线程执行,反正最后程序停止它也就被GC了。

void mian()
{            
        Thread t = new Thread(new ThreadStart(BackServer));
            t.IsBackground = true;
            t.Start();     
  }
 void BackServer()
{
            TimerCallback tcb = new TimerCallback(StartRefreshFriends);
            System.Threading.Timer timer = new System.Threading.Timer(tcb, null, 10, 500);
            while (timer != null)
                Thread.Sleep(0);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Delphi 11中,timeSetEventEx函数可以用来创建定时器。timeSetEventEx函数接受一个TIMECALLBACK类型的回调函数,并返回一个定时器ID,可用于取消定时器。 下面是一个使用timeSetEventEx函数创建定时器的示例代码: ``` unit TimerEx; interface uses Winapi.Windows, System.SysUtils; type TTimerEx = class private FTimerID: MMRESULT; FOnTimer: TProc; procedure TimerCallback(uTimerID, uMsg: UINT; dwUser, dw1, dw2: DWORD); stdcall; public constructor Create(Interval: Cardinal; OnTimer: TProc); destructor Destroy; override; procedure Stop; end; implementation { TTimerEx } constructor TTimerEx.Create(Interval: Cardinal; OnTimer: TProc); var te: TIMECAPS; begin inherited Create; if timeGetDevCaps(@te, SizeOf(te)) <> TIMERR_NOERROR then RaiseLastOSError; if te.wPeriodMin > Interval then Interval := te.wPeriodMin; FOnTimer := OnTimer; FTimerID := timeSetEventEx(Interval, te.wPeriodMin, @TimerCallback, NativeUInt(Self), TIME_PERIODIC); if FTimerID = 0 then RaiseLastOSError; end; destructor TTimerEx.Destroy; begin Stop; inherited; end; procedure TTimerEx.Stop; begin if FTimerID <> 0 then begin timeKillEvent(FTimerID); FTimerID := 0; end; end; procedure TTimerEx.TimerCallback(uTimerID, uMsg: UINT; dwUser, dw1, dw2: DWORD); stdcall; begin FOnTimer(); end; end. ``` 在使用时,可以通过创建TTimerEx对象来启动定时器: ``` procedure TForm1.FormCreate(Sender: TObject); begin TTimerEx.Create(1000, procedure begin Label1.Caption := FormatDateTime('hh:nn:ss', Now); end); end; ``` 需要注意的是,timeSetEventEx函数需要调用timeBeginPeriod函数来设置定时器的最小间隔,否则可能无法正常工作。另外,定时器回调函数必须是stdcall调用约定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值