线程问题(100分)

  • 主题发起人 主题发起人 feiyan_918
  • 开始时间 开始时间
F

feiyan_918

Unregistered / Unconfirmed
GUEST, unregistred user!
我在线程中把要查询的数据给查询出来了,如何能够发送个消息,并把这个数据集返回到主线程的DBGRID中。
 
用同步过程,把数据显示到dbgrid上
vcl组件线程不安全的,要用同步过程
 
//刚测试完,在delphi 2007上,没问题,可以在FORM1上的GRID上显示出来。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, StdCtrls, Grids, DBGrids;
type
TForm1 = class(TForm)
DBGrid1: TDBGrid;
Button1: TButton;
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
DataSource1: TDataSource;
procedure Button1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

TTestThread = class(TThread)
public
FDataSet: TDataSet;
procedure Execute;override;
constructor Create(CreateSuspended: Boolean);
end;

var
Form1: TForm1;
tt: TTestThread;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
tt := TTestThread.Create(False);
end;

{ TTestThread }
constructor TTestThread.Create(CreateSuspended: Boolean);
begin
inherited create(CreateSuspended);
FDataSet := FORM1.ADOQuery1;
end;

procedure TTestThread.Execute;
begin
inherited;
TADOQuery(FDataSet).Close;
TADOQuery(FDataSet).SQL.Clear;
TADOQuery(FDataSet).SQL.Text := 'select * from erpuser.userinfo';
TADOQuery(FDataSet).Open;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
tt.Destroy;
end;

end.
 
最简单的方法,将输出过程放在synchorne 中,不知道拼的对不对.
ado 不是线程安全的.所以请保证线程顺序或者用上面的方法.
 
lngdtommy的方法明显是不安全的,如果有多个线程怎么办?
ufo!已经说得很清楚了,用Synchronize方法,如:
procedure TThread1.ShowGrid;
begin
//显示到Form1的Grid里
end;

procedure TThread1.Execute;
begin
while not Terminateddo
begin
...
Synchronize(ShowGrid);
...
end;
end;
 
同意Corn3的观点,正解
 
近来关于线程的提问多了很多。
 
还有一个是不安全的,每个线程最好在放个TADOConnection,保持每个线程有一个会话,否则线程一多,就有问题了
 
同意楼上几位的,操作线程不安全的类,例如所有可视控件,请使用Synchronize。
lngdtommy同学明显对线程方面是菜鸟啊。
 
关于线程同步的问题,DELPHI的Tthread中提供了一个Synchronize专门用于线程同步的问题,不过想想做得更自如一点,可以用基于原生程序的API
 
就是Synchronize了!
 
后退
顶部