各位富翁,问个关于线程的问题。(100分)

  • 主题发起人 主题发起人 Moved
  • 开始时间 开始时间
M

Moved

Unregistered / Unconfirmed
GUEST, unregistred user!
[:)]
大家好!小弟我正学习多线程,现有一个问题请教: 在ADO查询或SP的OPEN时,是不是不能
同时执行多线程的代码? 我的代码如下:
unit frmGzcalc;
interface
uses
................
type
ThrdMsg=class(TThread)
protected
procedure Execute;override;
end;
TGzcalcForm = class(TForm)
Panel1: TPanel;
Label3: TLabel;
Label4: TLabel;
Label1: TLabel;
edtPersonID: TdxButtonEdit;
edtFirstDate: TDateTimePicker;
edtEndDate: TDateTimePicker;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
BitBtn4: TBitBtn;
grdGzcalc: TdxDBGrid;
spGzcalc: TADOStoredProc;
dsGzcalc: TDataSource;
.....
.....
.....
private
{ Private declarations }
public
{ Public declarations }
end;

var
GzcalcForm: TGzcalcForm;
Msgtrd:ThrdMsg;
implementation
{$R *.dfm}
uses DataCenter, ChoicePerson,frmMsg, frmNoExist;
procedure ThrdMsg.Execute;
begin
MsgForm.Label1.Caption:='Wait ....';
end;

procedure TGzcalcForm.BitBtn1Click(Sender: TObject);
begin
spGzcalc.Close;
spGzcalc.Parameters[1].Value:=edtFirstDate.Date;
spGzcalc.Parameters[2].Value:=edtEndDate.Date;
spGzcalc.Parameters[3].Value:=edtPersonID.Text;
MsgForm:=TmsgForm.create(self);
Msgtrd:=ThrdMsg.Create(False);
MsgForm.Show;
MsgForm.update;
spGzcalc.open;
MsgForm.Hide;
MsgForm.Close;
MsgForm.Free;
end;
end.

以上代码的功能是:点击一个按钮后弹出一MsgForm窗口,然后打开存储过程,
按道理这个时候也会运行线程MsgTrd中的代码,但为什么没有运行呢。因为运行后MsgForm
的Label1.Caption会为"Wait....."啊? 还有我也使用过同步(Synchronize)也不行啊。
请教各位问题出在哪儿吗? 谢谢了,晚上结贴.....
 
你的线程的CREATE呢?
 
倒数第9行:Msgtrd:=ThrdMsg.Create(False);
 
1.象你这样其实不用线程,直接在MsgForm.update;前MsgForm.Label1.Caption:='Wait ....';就是了。
2.Msgtrd:=ThrdMsg.Create(False);放在MsgForm.Show;之后试试。
3.在线程中操作VCL还是用Synchronize比较保险。
 
zw84611,谢谢!
1、这里我只是作个测试,我里面有一段FOR语句
2、还是不行
3、知道的,这个我也测试过,也不行。
 
如果你新建一个工程,如下代码是可以显示“Wait ....”的:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

ThrdMsg=class(TThread)
protected
procedure Execute;override;
end;

var
Form1: TForm1;
Msgtrd:ThrdMsg;

implementation
uses unit2;
{$R *.DFM}
procedure ThrdMsg.Execute;
begin
Form2.Label1.Caption:='Wait ....';
//还是用Synchronize比较保险,这里是为了简单
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Form2.Show;
Msgtrd:=ThrdMsg.Create(False);
end;

end.

可见是其它代码的关系,不妨把 spGzcalc.open;之类的过程放在线程中。
 
zw84611,这个我也试过了。如果你执行一段存储过程就不行了。也就是在上文开头我说的疑惑。
>>>大家好!小弟我正学习多线程,现有一个问题请教: 在ADO查询或SP的OPEN时,是不是不能
同时执行多线程的代码?
如果把spGzcalc.open放在线程代码中,那就不需要线程了。
 
在线程中操作ADO要初试化COM,Init*****的,你找找以前的帖子
 
如果你在保护方法里执行ADO控件的OPEN方法,和直接在主线程里执行好象没什么区别
 
呵,终于碰上重量级的富翁了。谢谢张无忌,能不能给段代码呀?
 
多人接受答案了。
 
后退
顶部