http://expert.csdn.net/Expert/topic/1278/1278475.xml?temp=.3958094刚才给我短消息的前辈 : 您好 ,您的方法是对的,关键在 调用时要显式的说明返回参数 。
存储过程 : CREATE proc dbo.getmoney
@name char(20),@theMoney Float output
as
begin
select @theMoney = money from one where name = @name
--select @theMoney as Result //
end 代码 : with ADOQuery2 do
begin
Close ;
Sql.Clear ;
Sql.Add('declare @a char(20),@b int') ;
Sql.Add('set @a = ''bbb''') ;
Sql.Add('set @b = 0') ;
P: Sql.Add('exec getmoney @a, @b output') ;//
Sql.Add('select @b as Result') ;
Edit2.Text := Sql.Text ;
Open ;
Label1.Caption := FieldByName('result').AsString ;
end;如果 P 行没有显式的写出 output ,则没有返回 。 谢谢您,原来一直没有发现,谢谢您--------------------------------------------------------------------------那个贴子我填了 100 ,只有 1 ?! --------------------------------------------------------------------------深深的感谢在我刚刚走进工作的时候给了我很多帮助的论坛的各位朋友,深深的感谢在我焦头烂额之际给我援助和支持的 Copy_paster大哥,深深的感谢在这段时间给了许多关怀和帮助的所有的朋友,深深的感谢CSDN,深深的感谢网络 !程序天堂,我心飞翔......
存储过程 : CREATE proc dbo.getmoney
@name char(20),@theMoney Float output
as
begin
select @theMoney = money from one where name = @name
--select @theMoney as Result //
end 代码 : with ADOQuery2 do
begin
Close ;
Sql.Clear ;
Sql.Add('declare @a char(20),@b int') ;
Sql.Add('set @a = ''bbb''') ;
Sql.Add('set @b = 0') ;
P: Sql.Add('exec getmoney @a, @b output') ;//
Sql.Add('select @b as Result') ;
Edit2.Text := Sql.Text ;
Open ;
Label1.Caption := FieldByName('result').AsString ;
end;如果 P 行没有显式的写出 output ,则没有返回 。 谢谢您,原来一直没有发现,谢谢您--------------------------------------------------------------------------那个贴子我填了 100 ,只有 1 ?! --------------------------------------------------------------------------深深的感谢在我刚刚走进工作的时候给了我很多帮助的论坛的各位朋友,深深的感谢在我焦头烂额之际给我援助和支持的 Copy_paster大哥,深深的感谢在这段时间给了许多关怀和帮助的所有的朋友,深深的感谢CSDN,深深的感谢网络 !程序天堂,我心飞翔......
---------------------------------------------------
大家看看
对那个线程的贴子,我的代码,他要 256 个,怎么都不行,该怎么办 ?
大哥也来呀
---------------------------------------------------
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;type
TForm1 = class(TForm)
Edit1: TEdit;
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;type
TMyThread = class(TThread)
private protected
procedure Execute; override;
public constructor Create; virtual;
end;
var
Form1 : TForm1;
HSem : THandle = 0 ;
implementation{$R *.dfm}procedure TMyThread.Execute;
var
WaitReturn : DWord ;
begin
WaitReturn := WaitForSingleObject(HSem,INFINITE) ;
Form1.Edit1.Text := DateTimeToStr(Now);
ReleaseSemaphore(HSem, 1, Nil)
end;constructor TMyThread.Create;
begin
inherited Create(False);
FreeOnTerminate := True;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
i: Integer;
begin
for i := 0 to 10 do //改小 ,100 时10多分钟后内存不足
begin
TMyThread.Create;
end;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
HSem := CreateSemaphore(Nil,10,10,Nil) ;
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
CloseHandle(HSem) ;
end;end.
var
WaitReturn : DWord ;
begin
WaitReturn := WaitForSingleObject(HSem,INFINITE) ;
Form1.Edit1.Text := DateTimeToStr(Now);
ReleaseSemaphore(HSem, 1, Nil)
end;
看不懂你的线程想做什么
还有
Form1.Edit1.Text := DateTimeToStr(Now);
会产生VCL组件的冲突,你又忘了访问VCL组件时要怎么做的吗?
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls,SyncObjs;type
TMyThread = class(TThread)
private protected
procedure Execute; override; { 执行线程的方法 }
Procedure GG ;
public constructor Create; virtual; { 线程构造器 }
end;
type
TForm1 = class(TForm)
Edit1: TEdit;
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
MyThread : Array of TMyThread ;
{ Private declarations }
public
{ Public declarations }
end;var
Form1 : TForm1;
Lock: TCriticalSection;
implementation{$R *.dfm}procedure TMyThread.Execute;
var
WaitReturn : DWord ;
begin
FreeOnTerminate := True;
Try
Lock.Enter ;
Synchronize(GG)
Finally
Lock.Leave ;
End;
end;constructor TMyThread.Create;
begin
inherited Create(False);
end;procedure TMyThread.GG ;
begin
Form1.Edit1.Text := DateTimeToStr(Now) ;
end;procedure TForm1.Timer1Timer(Sender: TObject);
var
I: Integer;
begin
SetLength(MyThread,256) ;
for I := 0 to 255 do // Iterate
begin
MyThread[i] := TMyThread.Create ;
end; // for
end;procedure TForm1.FormCreate(Sender: TObject);
begin
Lock := TCriticalSection.Create;
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
Lock.Free ;
end;end.
var
WaitReturn : DWord ;
begin
FreeOnTerminate := True;
Try
Lock.Enter ;
Synchronize(GG)
Finally
Lock.Leave ;
End;
end;
也不对吧,即使使用了Synchronize来同步方法GG,那就不需要Lock了,而且顺序不对啊。这样: Lock.Enter ;
Try
GG
Finally
Lock.Leave ;
End;
begin
while not Terminated do
begin
// do you code.
Sleep(10000); //等待10秒再继续,这也就得到Timer的效果了
end;
end;
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls,SyncObjs;type
TMyThread = class(TThread)
private protected
procedure Execute; override;
Procedure GG ;
public constructor Create; virtual;
end;
type
TForm1 = class(TForm)
Edit1: TEdit;
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
MyThread : Array of TMyThread ;
{ Private declarations }
public
{ Public declarations }
end;var
Form1 : TForm1;
Lock: TCriticalSection;
implementation{$R *.dfm}procedure TMyThread.Execute;
var
WaitReturn : DWord ;
begin
FreeOnTerminate := True;
Lock.Enter ;
Try
GG
Finally
Lock.Leave ;
End;
end;constructor TMyThread.Create;
begin
inherited Create(False);
end;procedure TMyThread.GG ;
begin
Form1.Edit1.Text := DateTimeToStr(Now) ;
end;procedure TForm1.Timer1Timer(Sender: TObject);
var
I: Integer;
begin
SetLength(MyThread,256) ;
for I := 0 to 255 do
begin
MyThread[i] := TMyThread.Create ;
end;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
Lock := TCriticalSection.Create;
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
Lock.Free ;
end;end.
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
FThreads: TList;
procedure Start;
procedure Stop;
procedure ThreadOnTerminate(Sender: TObject);
end;var
Form1: TForm1;implementationuses SyncObjs;
{$R *.dfm}type
TMyThread = class(TThread)
protected
procedure Execute; override;
end;var
Lock: TCriticalSection = nil;procedure TMyThread.Execute;
begin
while not Terminated do
begin
Lock.Enter;
try
Form1.Edit1.Text := TimeToStr(Time);
finally
Lock.Leave;
end;
Sleep(100);
end;
end;procedure TForm1.Start;
var
I: Integer;
Thread: TThread;
begin
Lock.Enter;
try
for I := 0 to 255 do
begin
Thread := TMyThread.Create(False);
Thread.OnTerminate := ThreadOnTerminate;
FThreads.Add(Thread);
end;
finally
Lock.Leave;
end;
end;procedure TForm1.Stop;
var
I: Integer;
begin
Lock.Enter;
try
for I := FThreads.Count - 1 downto 0 do
TThread(FThreads[I]).Terminate;
finally
Lock.Leave;
end;
end;procedure TForm1.ThreadOnTerminate(Sender: TObject);
var
Index: Integer;
begin
Lock.Enter;
try
Index := FThreads.IndexOf(Sender);
if Index <> -1 then
FThreads.Delete(Index);
finally
Lock.Leave;
end;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
Start;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
Stop;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
Lock := TCriticalSection.Create;
FThreads := TList.Create;
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
Stop;
// 别去Free那个Lock
end;end.
放在 OnTimer 中还是不行,看来这个不能实现 。
---------------------------------------------------------------
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
FThreads: TList;
procedure Stop;
procedure ThreadOnTerminate(Sender: TObject); { Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
implementation{$R *.dfm}
uses SyncObjs;
type
TMyThread = class(TThread)
protected
procedure Execute; override;
end;var
Lock: TCriticalSection = nil;
procedure TForm1.FormCreate(Sender: TObject);
begin
Lock := TCriticalSection.Create;
FThreads := TList.Create;
end;procedure TMyThread.Execute;
begin
while not Terminated do
begin
Lock.Enter;
try
Form1.Edit1.Text := TimeToStr(Time);
finally
Lock.Leave;
end;
end;
end;{procedure TForm1.Start;
var
I: Integer;
Thread: TThread;
begin
Lock.Enter;
try
for I := 0 to 255 do
begin
Thread := TMyThread.Create(False);
Thread.OnTerminate := ThreadOnTerminate;
FThreads.Add(Thread);
end;
finally
Lock.Leave;
end;
end; }procedure TForm1.Stop;
var
I: Integer;
begin
Lock.Enter;
try
for I := FThreads.Count - 1 downto 0 do
TThread(FThreads[I]).Terminate;
finally
Lock.Leave;
end;
end;procedure TForm1.ThreadOnTerminate(Sender: TObject);
var
Index: Integer;
begin
Lock.Enter;
try
Index := FThreads.IndexOf(Sender);
if Index <> -1 then
FThreads.Delete(Index);
finally
Lock.Leave;
end;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
Stop ;
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
Stop ;
end;procedure TForm1.Timer1Timer(Sender: TObject);
var
I: Integer;
Thread: TThread;
begin
Lock.Enter;
try
for I := 0 to 255 do
begin
Thread := TMyThread.Create(False);
Thread.OnTerminate := ThreadOnTerminate;
FThreads.Add(Thread);
end;
finally
Lock.Leave;
end;
end;
end.
var
WaitReturn : DWord ;
begin
FreeOnTerminate := True;
Try
Lock.Enter ;
Synchronize(GG)
Finally
Lock.Leave ;
End;
end;
也不对吧,即使使用了Synchronize来同步方法GG,那就不需要Lock了,而且顺序不对啊。这样: Lock.Enter ;
Try
GG
Finally
Lock.Leave ;
End;
法律首席顾问:Ghyghost
2002-12-21
我还有一些要不要啊,给版权得了,哦,你在跟CSDN的FAQ和精华区的抢贴子啊,呵呵。
其它朋友 : Some 2 ,Some no, Sorry :)Thanks for your help , and continue helping me ,thank you !Wish you happy !Merry Christmas !