源代码:
EnterCriticalSection(CS);
with AdoQry do
begin
end;
LeaveCriticalSection(CS);
EnterCriticalSection(CS);
with AdoQry do
begin
end;
LeaveCriticalSection(CS);
解决方案 »
- 低级问题:如何把DBGrid查询的在不删除的情况下增加第二次查询的内容
- 急死人的问题啊!!!!
- 字段问题?
- 用form1.Canvas怎么样显示背景图片??
- 哥哥们好,能帮小mm找一下这个控件吗?
- 心情不好,为什么不再给一个机会呢?散分
- 请问如何修改QQ?
- 当我用adotable链接数据库时出现这种情况
- 完蛋拉!运行不了BDE Administrtor了。老大们。怎么办啊,
- DELPHI如何用WINDOWS的API,,??为什么我的不能用,SOCKET这个类型?
- 从SQL SERVER里读数据到ACCESS里,但有3万多条,速度太慢,怎么解决??
- 急:如何得到本级的IP地址??? 急急急急急急
with AdoQry do
begin
end;
代码中有问题。把这段代码去咯,换上beep(),试试!
我注意到你在线程中用了一个TADOQuery对象,这个对象会创建并调用ADORecordset对象,这是一个COM对象,它的使用与对象的线程模式有关.并且,在"公寓线程"中创建的对象是不能在其它线程中随意使用的,要通过"列集"与"散集"的方式把它传给另一个线程.
建议用如下方式来完成对ADOQuery访问的串行化:
1:在你的线程对象中加一个方法:
procedure GetQueryData;
begin
with AdoQry do
begin
end;
end;
2:你的代码改为:
Synchronize(GetQueryData);
这样,不使用临界区,也完成了串行化,而GetQueryData中的代码是在主线程中执行的,不容易出错.
线程在休眠时(TThread.Suspend),不会执行任何语句,直到被唤醒,与循环没有关系.
Delphi的TThread在停止时(TThread.Terminate)并没有终止线程,只是把Terminated属性设为true.而通常线程都是这样写的:
...
while (not Terminate) and (...) do
begin
...
end;
这时就会退出循环,不过循环中的语句会被完整执行.
如果要强制终止线程,应该用:TerminateThread(MyThread.Handle);