初衷是想在执行SQL查询的过程中,让用户可以点击“终止”而放弃查询。在网上搜了一些代码,自己修改一下做测试,结果不行。以下是我的测试代码:TForm1上三个按钮:
Button11,用于建立新线程,并指向执行SQL查询的函数;
Button22,用于启动SQL——点这就出现异常错误;
Button33,用于终止查询——还没试到这一步。//---------线程入口函数
function MyThreadFun(p: Pointer): Integer; stdcall;
var
quy:TADOQuery;
begin
with TADOQuery.Create(application) do
begin
Connection:=ADOConnection1;//ADOConnection1是进入系统时的公用连接.
close;
SQL.Clear;
SQL.add('exec PRC_TEST');
//服务器端过程 PRC_TEST 的主要内容就一句:WAITFOR DELAY '02:00'
Open;
end; Result := 0;
end;//---------建立并挂起线程
procedure TForm1.Button11Click(Sender: TObject);
var ID: DWORD;
begin
hThread := CreateThread(nil, 0, @MyThreadFun, nil, CREATE_SUSPENDED, ID);
//Button1.Enabled := False;
end;//---------唤醒并继续线程,启动查询
procedure TForm1.Button22Click(Sender: TObject);
begin
ResumeThread(hThread);
end;//---------取消SQL查询
procedure TForm1.Button33Click(Sender: TObject);
begin
ADOConnection1.Cancel;;
end;烦请各位给予指导,谢谢!
Button11,用于建立新线程,并指向执行SQL查询的函数;
Button22,用于启动SQL——点这就出现异常错误;
Button33,用于终止查询——还没试到这一步。//---------线程入口函数
function MyThreadFun(p: Pointer): Integer; stdcall;
var
quy:TADOQuery;
begin
with TADOQuery.Create(application) do
begin
Connection:=ADOConnection1;//ADOConnection1是进入系统时的公用连接.
close;
SQL.Clear;
SQL.add('exec PRC_TEST');
//服务器端过程 PRC_TEST 的主要内容就一句:WAITFOR DELAY '02:00'
Open;
end; Result := 0;
end;//---------建立并挂起线程
procedure TForm1.Button11Click(Sender: TObject);
var ID: DWORD;
begin
hThread := CreateThread(nil, 0, @MyThreadFun, nil, CREATE_SUSPENDED, ID);
//Button1.Enabled := False;
end;//---------唤醒并继续线程,启动查询
procedure TForm1.Button22Click(Sender: TObject);
begin
ResumeThread(hThread);
end;//---------取消SQL查询
procedure TForm1.Button33Click(Sender: TObject);
begin
ADOConnection1.Cancel;;
end;烦请各位给予指导,谢谢!
解决方案 »
- 求类似java的hmac-sha1算法的delphi代码例子。
- 有个很少的C++源码急着需要翻译成其它源码,版主、高手请进。
- 外壳扩展的问题.
- 怎么判断stringgrid里的内容改变没有,如果改变'退出'button就提示您的内容改变了,还保存吗?
- 插入数据后立刻查询,返回数据条数总是少1条的问题
- 关于sendbuf(var buff;count:integer)参数问题
- 怎样用WATCH监视一个变量?为什么我填上变量名都不行?
- 除了delphi还有什么pascal的编译器呢?
- 通信问题
- 何处有ftp服务器控件下载(愿付费)?
- 在Pascal的一段代码
- DELPHI edit.clear问题
try
......
finally
CoUninitialize;
end;
在线程中用ADO连接需要加入上面的语句。
这个,就是用来终止过程执行的,应该可以的。
谢谢你的回答。
按你说的,我这样,错误依旧:
function MyThreadFun(p: Pointer): Integer; stdcall;
begin
try
Coinitialize(nil);
with TADOQuery.Create(application) do
begin
Connection:=ADOConnection1;
close;
SQL.Clear;
SQL.add('exec PRC0300');
Open;
end;
finally
CoUninitialize;
end;
end;
SQL.Add('select * from t1');//找一个记录数少的表,看是否出错。
你用CreateThreadchuan创建线程必须把全局变量IsMultiThread设置为true,或者用BeginThread来创建线程,
当然最好是继承TThread来做。