初学线程,请赐教--急!在线等待(100分)

  • 主题发起人 主题发起人 crazyworker
  • 开始时间 开始时间
C

crazyworker

Unregistered / Unconfirmed
GUEST, unregistred user!
为何我的线程经常死?
线程死掉有什么原因啊?
 
我是这样调用线程的
threadA:=threadone.create(false)
这样是不是不行啊?
 
synchronize
 
是不是你的线程没释放把,试试这样:
threadA:=threadone.create(true)
threadA.FreeOnTerminate:=true;
threadA.Resume;
 
两位,具体一点啊。
迷糊,threadA.Resume是调用线程对吗?
 
迷糊大哥,不行啊~~~~~~~~~~~~还是死
 
线程中是否调用了主进程中的东东
另外不要用对像Create
要用类型Create
 
whtsuperant,有调用,另外,用类型Create是什么意思啊?
 
Resume: 是重新执行挂起的线程。
threadone.create(false)是创建之后马上运行, true 的话是创建之後线挂起所以要Resume。
楼上提到同步的问题也要注意。
不只是每次都死,还是不定期的死?最好把代码贴出来看看
 
你先把调用进程中的东东去了,看看还有没有你说的现像
类型Create指:threadone是线类型还是线程对像?
 
我是用神经网络理论进行编程的,线程代码如下:
procedure threadone.Execute;
var
i,j,count,count2:integer;
begin
freeOnTerminate:=true;
begin
{ Place thread code here }
//用hopfield网络计算选号;
///初始化
for i:=1 to 31do
for j:=1 to 31do
form4.distance[i,j]:=1-form4.distance[i,j];
randomize();
form4.caluWij();
for i:=1 to 31do
for j:=1 to 31do
begin
form4.S[i,j]:=0+random(10)/10000;
form4.Uc[i,j]:=0;
end;
count:=1;
count2:=1;
form4.randomRan(961,961);
for i:=1 to 961do
form4.ran:=form4.ran-1;
form9.Show;
////////////////////////////
repeat
if Terminated then
break;
if count=962 then
begin
form4.randomRan(961,961);
for i:=1 to 961do
form4.ran:=form4.ran-1;
count:=1;
end;
i:=(form4.ran[count] mod 31 )+1;//取余+1作为个位
j:=(form4.ran[count] div 31 )+1;//取整+1作为十位
form4.updateUc(j,i);
if form4.Uc[j,i]>0
then
form4.S[j,i]:=1
else
form4.S[j,i]:=0;
form4.caluE1();
form4.caluE2();
form4.caluE3();
form9.label3.caption:=inttostr(count);
if form4.S[i,j]=1 then
begin
form9.canvas.brush.Style := bsSolid;
form9.canvas.brush.Color := clBlack;
form9.Canvas.Ellipse((20+20*(j-1)),
(20+20*(i-1)),(30+20*(j-1)),(30+20*(i-1)));
end
else
if form4.S[i,j]=0 then
begin
form9.canvas.brush.Style := bsSolid;
form9.canvas.brush.Color := clwhite;
form9.Canvas.Ellipse((20+20*(j-1)),
(20+20*(i-1)),(30+20*(j-1)),(30+20*(i-1)));
end;
count:=count+1;
count2:=count2+1;
until
((form4.E1=0) and (form4.E2=0) and (form4.E3=0))
showmessage('计算完毕。');
for j:=1 to 31do
if form4.S[j,1]=1 then
form4.suiEdit8.Text :=inttostr(j);
for j:=1 to 31do
if form4.S[j,2]=1 then
form4.suiEdit9.Text :=inttostr(j);
for j:=1 to 31do
if form4.S[j,3]=1 then
form4.suiEdit10.Text :=inttostr(j);
for j:=1 to 31do
if form4.S[j,4]=1 then
form4.suiEdit11.Text :=inttostr(j);
for j:=1 to 31do
if form4.S[j,5]=1 then
form4.suiEdit12.Text :=inttostr(j);
for j:=1 to 31do
if form4.S[j,6]=1 then
form4.suiEdit13.Text :=inttostr(j);
for j:=1 to 31do
if form4.S[j,7]=1 then
form4.suiEdit14.Text :=inttostr(j);
if form4.fie=8 then
begin
for j:=1 to 31do
if form4.S[j,8]=1 then
form4.suiEdit24.Text :=inttostr(j);
end
else
form4.suiEdit24.Text:='';
end;
end;
有调用其它窗体的过程和变量,这样是否不行?
 
并不是每次都死,但是经常死。
 
天啊,这样不死才怪。Delphi的线程类规定对那些涉及界面的VCL
类操作必须在主线程中进行。
 
如果是一个空的线程,是不会死的。除非你在线程中做了的事情有问题。例如阻塞操作,死循环,挂起等等。
你可以一步一步调试你的线程。首先保证线程可以正常启动和正常结束。然后再在线程的执行函数中执行你的任务。
 
经常死就对了,线程的错误就是这种特点。
是一种偶发性错误.
 
那就对了,把线程中操作vcl的部分分离出来放在synchronize中。
建议你还是先找本书看看吧
 
xeen,你的意思是不要在线程中执行form9.Canvas之类的操作吗?
那访问其它窗体的变量以及过程是否可以?
 
呵呵。。迷糊大哥,我急啊,毕业设计啊~~就要答辩了
可否告知synchronize的使用方法
 
绝对死,
在execute 中调用
Synchronize(somefun);
在somefun中完成你的功能就没事了
 
那些从Tcontrol类继承下来的类的成员变量、成员函数都不行.
必须放在synchronize中执行.
 
后退
顶部