线程的结束问题.难啊....(100分)

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

fu_qi_ming

Unregistered / Unconfirmed
GUEST, unregistred user!
我有这样一线程,他主要是连接数据库和查询数据库的,他的Tdatabase,TQuery用的主线程的
Tsession用的默认Default.主线程是界面操作,每一时刻都保证,只有一个线程操作数据库.
问题:因为网络原因或查询的数据量太大.有些数据库操作化费时间太长.无法忍受.需要中断
线程.请问怎样中断?
方法:1,用Thread.Terminate;不行.因为在Thread.Execute中,因为线程中,只是一个查询或
连接数据库,没有循环,无法判断Thread.Terminated的值来退出线程.
2,用TerminateThread();中断,以后数据库怎么也连接不上执行到Database.Open死在
那里,不能操作不知为何?(是不是这个Api的没有释放资源的问题.会不会对他有影
响,我想不同资源没有释放怎么会影响Database连不上数据库)
请问有什么更好的办法.在查询耗时长,保证资源释放,又能重新连接数据库操作的办法.如果
不行,只要能结束线程,能继续操作数据库即可.资源不能释放就算了.
 
线程中用单独的 session不要用主窗体的。
 
terminate 后要waitfor
thread.terminate;
thread.waitfor
 
to 迷糊:我在线程中用主线程的连接有什么问题.我处理了线程同步,运行很好,没有出现
问题.只是终止线程出现问题.请问线程中单独用连接.和不用有什么区别,有什么
影响.(原理)
to:huiyue:terminate 后要waitfor
thread.terminate;
thread.waitfor这样不行,因为在Thread.Execute中没有循环,无法判断
Terminated的值进行退出.它只做了个查询.(请参照方法1.)
 
高手帮我啊......
 
创建次级线程时,用一个线程数组把它们记录下来,然后写一个过程把它们全结束掉。
在主线程EXECUTE的最后(或FREE时)调用这个过程。
unit Unit3;
interface
uses
Classes;
type
TMultiSearchThread = class(TThread)
private
{ Private declarations }
SearchThreads: array of TThread;
protected
procedure Execute;
override;
procedure StopAllThreads;
end;

const
SEARCHTHREAD_COUNT = 1;
implementation
uses Unit2, Unit1;
{ TMultiSearchThread }
procedure TMultiSearchThread.Execute;
var
multithread: TMainSearchThread;
//需要调用次级线程
i: integer;
begin
//Form1.PFilelist.Cursor := crHourGlass;
SetLength(SearchThreads, SEARCHTHREAD_COUNT);
for i := 0 to SEARCHTHREAD_COUNT - 1do
begin
MultiThread := TmainSearchThread.Create(true);
SearchThreads := MultiThread;
MultiThread.FreeOnTerminate := true;
MultiThread.Resume;
if Terminated then
exit;
//Form1.pFileList.cursor := CrDefault;
end;

//Suspend;
//挂起
//StopAllThreads;//一旦激活,则立即结束
end;

procedure TMultiSearchThread.StopAllThreads;
var
multithread: TThread;
i: integer;
begin
for i := 0 to SEARCHTHREAD_COUNT - 1do
begin
MultiThread := SearchThreads;
MultiThread.Terminate;
//通知停止
end;
for i := 0 to SEARCHTHREAD_COUNT - 1do
begin
MultiThread := SearchThreads;
MultiThread.WaitFor;
//等待
end;
end;
但这样你会发现你的主线程的问题:创建完次线程后,主线程没事做了,就会结束。
因此,你的主线程应该要在创建次线程完成后就挂起。要停止时先将其激活。
 
to aolo:
thread.terminate;
thread.waitfor
我在Thread.Execute里没有处理Thread.Terminated的值.
这样能退出线程吗?,因为在Thread.Execute中没有循环,无法判断
Terminated的值进行退出.它只做了个查询.(请参照方法1.)
[red]发言看看问题,好吗?如果我说错了,指正一下即可,不要做重复功.[/red]
 
我给一些建议:
首先不能用API(TerminateThread),正如你说的,这个函数不会释放程序自己建立的资源,可能会妨碍后续处理。
所以我认为只能在线程代码里加入处理,我常在VC里用这样的办法就是在“不可打断的”耗时的操作之后加入判断使线程退出,在某些“可能阻塞”的操作后也加入判断,但可通知此类“阻塞”的操作停止阻塞(事件机制等)。
另外我考虑是否可把线程可能用到的资源作记录,并设置初始值,用TerminateThread终止线程后,看此线程是否已分配了对应的资源,如果有的话就释放资源。
 
我还发现如果在线程中创建了Session,等线程运行完,之后,资源也释放了,但是这个SessionName好像还在.
 
高手了.唉,还是没人帮我啊..
发现线程里只要用到BDE的组件,如果你强行结束,那么就无法通过BDE连接数据库.
 
算了,没人会了.结了吧.平分.
 
顶部