用timer控件每隔10秒执行一次线程 怎么解决 ? 来都有分
公司要求每隔10秒,把mssql中的数据插入到oracle数据库中,我现在改用了多线程来执行.
我在 terimer事件中,执行 createthread(),但发现oracel数据库中有好多重复的数据,不知怎么解决?
[解决办法]
不需要用timer,只用1个线程就好了吧,每次结束就延时10秒再继续
数据是否重复,那是插入数据代码没处理好,除非有并发的情况,否则和线程没关系
[解决办法]
精确一点,就用线程,在线程的回调函数中,再次调用线程API函数.是可行的.
当然中间SLEEP(10000)
[解决办法]
其实很简单,在Timer事件里运行时 先enabled := false; 执行完入库,再enabled := True; 就好!
[解决办法]
function CreateWaitableTimer(
lpTimerAttributes: PSecurityAttributes; {安全}
bManualReset: BOOL; {True: 可调度多个线程; False: 只调度一个线程}
lpTimerName: PWideChar {名称}
): THandle; stdcall; {返回句柄}
function SetWaitableTimer(
hTimer: THandle; {句柄}
var lpDueTime: TLargeInteger; {起始时间}
lPeriod: Longint; {间隔时间}
pfnCompletionRoutine: TFNTimerAPCRoutine;{回调函数的指针}
lpArgToCompletionRoutine: Pointer; {给回调函数的参数}
fResume: BOOL {是否唤醒系统}
): BOOL; stdcall; {}
[解决办法]
或者可以用存储过程, 预先写好存储过程, 在插入的时候在存储过程中检查是否有重复
或者直接把这个键设置成 主键或者不可重复
////===================================================
用计时器来触发线程,真还不如直接在线程里面 sleep
[解决办法]
晕,单用线程就可以处理这个问题呀,你用Time倒不好!
[解决办法]
很好处理,在Timer的OnTimer事件中这样写
Timer.Enable := false; //关闭定时器
width Thread.Create do
OnTerminate := CloseSyncThread; //注意此处,CloseSyncTherad是线程执行完毕释放时的事件。定义如下:
procedure CloseSyncThread(Sender:TObject);
begin
Timer.Enable := true; //启动定时器
end;
在线程里加入FreeOnTerminate:=true; //线程结束时,自动释放资源
这就是一个完整的循环了!
[解决办法]
直接用线程加事务一次性处理,再触发,这样挺好的。
[解决办法]
[解决办法]
用一个线程。
直接完全复制表插入?