搞不懂线程是为什么了? (200分)

  • 主题发起人 主题发起人 buff
  • 开始时间 开始时间
B

buff

Unregistered / Unconfirmed
GUEST, unregistred user!
主程序(Form):
var
th1,th2,th3,th4,th5:TmyThread;
begin
Th1 :=Tmythread.create(memo1);
Th2 :=Tmythread.create(memo1);
Th3 :=Tmythread.create(memo1);
Th4 :=Tmythread.create(memo1);
Th5 :=Tmythread.create(memo1);
end;

Tmythread:
//包含一个FORM2(不是主Form)
procedure Tmythread.updateInfo;
begin
//这个地方一直处理事情,到线程终止
end;

procedure Tmythread.Execute;
begin
inherited;
Synchronize(upDateInfo);
end;
constructor Tmyht.Create(Memo: Tmemo;
ini: Tinifile;uid,dx:integer;No:boolean);
begin
Fmemo :=Memo;
Freeonterminate :=true;
inherited create(false);
end;
//form2是一个窗体,只有几个非可视的vcl
问题在于,这样以后,th1执行,th2,-th5,都不执行?
如果加上th2.execute;就只有th2执行,为什么?
各位大虾帮个忙呀,急呀!
 
你的县城里在处理数据库吧?有些数据库连接是不支持多线程的!
 
没有数据库,只有一些idhttp
 
两个问题,先说小问题:
Create函数这样写会好一些:
begin
inherited Create(True);
// 先不要执行
FreeOnTerminate := True;
...
Resume();
end;

再说大问题:
UpdateInfo函数是放在主线程执行的,因此必须有退出点!!!
否则其他所有线程的Synchronize过程都被锁!!!
一般可以这样:
procedure TMyThread.UpdateInfo;
begin
// 只作一个短处理,处理完毕后马上返回!!!
end;

procedure TMyThread.Execute;
begin
inherited;
while not Terminatedo
begin
Synchronize(UpdateInfo);
Sleep(0);
// 或者一个更大的间隔
end;
end;
 
同意楼上
 
在你的线程中的execute里同步了updateinof过程,
这个同步的意思就是防止在本进程访问资源时避免其它进程同时访问,如果在同步过程中处理的
时间很长或者甚至产生死循环这是其它里程由于不能访问需要的资源所以就被系统挂起,当然不在
执行了。所以这里重点要检查你的updateinfo过程。
另外你建立线程时全部使用了memo1这个组件,不知你在哪里访问的它,这个也必须要考虑同步访问
问题
 
gztomash,
说的对,以前碰到过这问题,
正式楼上兄弟所讲
 
多人接受答案了。
 
后退
顶部