delphi 关于线程运行机制的疑惑 160
小弟初涉线程,当前编写了一个浏览文件夹中的JPG文件并有序的排列在窗口中的程序,类似百度图片的显示方法,除了浏览文件夹的代码意外后面的创建paintbox控件、计算排列顺...
小弟初涉线程,当前编写了一个浏览文件夹中的JPG文件并有序的排列在窗口中的程序,类似百度图片的显示方法,除了浏览文件夹的代码意外后面的创建paintbox控件、计算排列顺序以及paintbox的paint方法都是在线程中完成的,但是在运行过程中,如果做了点击右边滚动条的动作,则图片的排列就会出现问题,图片会跳过一次排列循环显示,造成断层,按道理这些代码都是在线程中运行的,我在窗体总的操作应该值影响主进程的代码运行,怎么会影响到子线程的代码呢?是我对线程的理解有错误还是代码中有什么没进行处理的?下面是主要代码:如有代码书写不当的地方也请指教一二!
procedure tpicthread.Execute;
begin
{ Place thread code here }
if main_unit.modes=false then self.Synchronize(manual)
else self.Synchronize(auto);
end;
procedure tpicthread.manual;
var n:integer;
filestr:string;
begin
nt1:=10;
nt2:=10;
nt3:=10;
i:=1;
for n:=0 to main_unit.filelit.Count-1 do
begin
filestr:=main_unit.filelit.Strings[n];
cpb(n,filestr);
application.ProcessMessages;
end;
end;
procedure tpicthread.cpb(num:integer;filestr:string);
begin
pbox:=tpaintbox.Create(main_unit.mainpage);
pbox.Hide;
try
pbox.Name:='pic'+inttostr(num);
except
showmessage(' ');
end;
pbox.Parent:=main_unit.showpic;
pbox.Color:=clWhite; jpg:=tjpegimage.Create;
jpg.LoadFromFile(filestr);
pbox.Height:=boxh(main_unit.showpic,jpg);
arrange(pbox);
pbox.SetBounds(ntleft,nttop,round((main_unit.showpic.Width-40)/3),boxh(main_unit.showpic,jpg));
pbox.Show;
pbox.PopupMenu:=mainpage.PopupMenu1;
pbox.OnPaint:=showpic;
jpg.Free;
end;
procedure tpicthread.arrange(var pb:tpaintbox);
begin
case i mod 3 of //这里是排列算法
1:
2:
0:
end;
i:=i+1;
application.ProcessMessages;
end; 展开
procedure tpicthread.Execute;
begin
{ Place thread code here }
if main_unit.modes=false then self.Synchronize(manual)
else self.Synchronize(auto);
end;
procedure tpicthread.manual;
var n:integer;
filestr:string;
begin
nt1:=10;
nt2:=10;
nt3:=10;
i:=1;
for n:=0 to main_unit.filelit.Count-1 do
begin
filestr:=main_unit.filelit.Strings[n];
cpb(n,filestr);
application.ProcessMessages;
end;
end;
procedure tpicthread.cpb(num:integer;filestr:string);
begin
pbox:=tpaintbox.Create(main_unit.mainpage);
pbox.Hide;
try
pbox.Name:='pic'+inttostr(num);
except
showmessage(' ');
end;
pbox.Parent:=main_unit.showpic;
pbox.Color:=clWhite; jpg:=tjpegimage.Create;
jpg.LoadFromFile(filestr);
pbox.Height:=boxh(main_unit.showpic,jpg);
arrange(pbox);
pbox.SetBounds(ntleft,nttop,round((main_unit.showpic.Width-40)/3),boxh(main_unit.showpic,jpg));
pbox.Show;
pbox.PopupMenu:=mainpage.PopupMenu1;
pbox.OnPaint:=showpic;
jpg.Free;
end;
procedure tpicthread.arrange(var pb:tpaintbox);
begin
case i mod 3 of //这里是排列算法
1:
2:
0:
end;
i:=i+1;
application.ProcessMessages;
end; 展开
1个回答
2013-05-11
展开全部
线程中使用 application.ProcessMessages; 不是好主意
追问
这个东西也是学的别人代码里面的,貌似在一些比较耗时的循环中使用application.ProcessMessages;可以避免死锁,循环中相应外界事务用
我这里用application.ProcessMessages;有什么问题吗?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询