子线程内更新主窗记录显示的问题(30分)

  • 主题发起人 主题发起人 gxw
  • 开始时间 开始时间
G

gxw

Unregistered / Unconfirmed
GUEST, unregistred user!
想在主窗口用adoquery1+dbgrideh显示记录,子线程则负责接收并写记录,然后刷新dbgrideh的显示.但目前却遇到了子线程内无法执行adoquery1.DisableControls的问题,弄的dbgridEh不断闪烁.....用过定义临界区的办法也无效.严重郁闷~~[:(][:(]
procedure TForm1.bitbtn1Click(Sender);
//------主程序
begin
with adoquery1do
begin
close;
sql.clear;

sql.add('select * from Table1');
open;
//---启动线程
StopThread:=False;
//全局变量
myThread.Create(False);
end;
end;

procedure myThread.Execute;
//-------子线程
var aqu2: Tadoquery;
begin
aqu2:=TAdoQuery.Creat(Application);
repeat
try
......
...... //用aqu2控制接收和写记录到Table1内,一切正常
......
// 刷新
with form1.adoquery1do
begin
[red]DisableControls;[/red] // <---此处老报错:&quot;ADOQuery1:Cannot perform this operation on a close dataset.&quot;
去掉则立即正常
Close;
Open;
[red]EnableControls;[/red]
end;

except
on E: Exceptiondo
ShowMessage(E.message);
end;

until StopThread;
aqu2.free;
end;
 
if Active then
DisableControls;
 
to djrj:
已经试过,依然报错...[:(]
 
dbgrideh和adoquery1本身并无定义任何事件...
 
考虑过线程同步问题吗,子线程中不能直接调用vcl的.
 
to xeen:
可去掉那红的两句却又可以正常运行?
 
线程同步错误是一种随机错误,就是说不知道什么
时候你的程序就出错了。
 
谢谢,我再试下用互斥信号...[?]
 
互斥也无效.有点莫名其妙了...
 
线程中直接调用可视化的vcl控件,需要考虑同步问题。
 
不要考虑这么多,你直接给窗体发送一个消息,在主窗体中刷新不行吗?
 
to dey-999:
也已经考虑过这做法,但没想通如何在主窗执行刷新.例如子线程写了记录进Table1,给主窗口返回一个信号值 NewId:=1, 之后我还得在主程序弄个timer什么的不停扫描这信号值然后干活?按以往的测试,用timer很有种粘滞没焦点的感觉. 要是多弄个子线程专干这个,好象这弯弯又绕回来了,还是子线程负责刷新显示~~[:D][:D]
 
严重告诉你:所有可视VCL控件的刷新都应在主线程中进行(天意不可违……*……%—%—%)。
其它相信你能解决。
 
呵呵,问题解决:还是在子线程内控制刷新,只是控制刷新的语句写为子程序,然后在需要调用的地方使用Synchronize(子程序)就搞定了~~~

结帖散分~~~人人有份[:D]
 

Similar threads

后退
顶部