在我编写的程序中用以下调用线程
:
t:=mytthread.create(adoconnection1,listbox1);
t.Resume;
e:=mytthread.create(adoconnection2,listbox1);
e.Resume;
u:=mytthread.create(adoconnection3,listbox1);
u.Resume;
我用以上方法调用线程来对数据库填加数据 , 但有时能够全部填加成功 , 有时候数据填加的数据并不全 , 不是缺这个就是少那个 , 我该怎么办 ? 是否一定用线程池呀 ? 但我一点也不懂 .
t:=mytthread.create(adoconnection1,listbox1);
t.Resume;
e:=mytthread.create(adoconnection2,listbox1);
e.Resume;
u:=mytthread.create(adoconnection3,listbox1);
u.Resume;
我用以上方法调用线程来对数据库填加数据 , 但有时能够全部填加成功 , 有时候数据填加的数据并不全 , 不是缺这个就是少那个 , 我该怎么办 ? 是否一定用线程池呀 ? 但我一点也不懂 .
就是线程同步的问题;
牵涉到多个线程同时对表修改是就要注意这点。线程不能同时修改表。
方法一:
首先。声明一个标示临界区的变量,如 CS:TRTLCriticalSection; ,然后调用 initializecriticalsection(CS) 初始化临界区。
然后,调用 entercriticalsection(CS) ,那么之后的代码就只能由一个线程执行,知道调用 leavecriticalsection(CS)
最后,调用 deletecriticalsection(CS) ,释放资源
方法二:互斥变量
hmutex:=createmutex(nil,false,nil); // 创建一个互斥变量
if waitforsingleobject(hmutex,infinite)=wait_object_0 then // 永远等待互斥变量
begin // 发信号
.............
end;
releasemutex(hmutex);// 释放互斥变量,等待该互斥变量发信号的就可以执行了
牵涉到多个线程同时对表修改是就要注意这点。线程不能同时修改表。
方法一:
首先。声明一个标示临界区的变量,如 CS:TRTLCriticalSection; ,然后调用 initializecriticalsection(CS) 初始化临界区。
然后,调用 entercriticalsection(CS) ,那么之后的代码就只能由一个线程执行,知道调用 leavecriticalsection(CS)
最后,调用 deletecriticalsection(CS) ,释放资源
方法二:互斥变量
hmutex:=createmutex(nil,false,nil); // 创建一个互斥变量
if waitforsingleobject(hmutex,infinite)=wait_object_0 then // 永远等待互斥变量
begin // 发信号
.............
end;
releasemutex(hmutex);// 释放互斥变量,等待该互斥变量发信号的就可以执行了
如果你需要在线程中访问
VCL
资源,那么你用
Synchronize(
自定义过程
);
就可以了 ~~~~~
就可以了 ~~~~~