我的程序中多个线程为什么不能很好地并行(急!)(100分)

  • 主题发起人 主题发起人 我爱猪猪
  • 开始时间 开始时间

我爱猪猪

Unregistered / Unconfirmed
GUEST, unregistred user!
最近在写一个比较大的程序,初次遇到多线程的问题.有两个Form,在Form1中有两个按钮和一个image,Form2中只有一个image,点Button1从文件中打开图片写到Form1的Image1上,点Button2,将Form1上的图片写到Form2的Image上(图片缩小,占据image的1/10面积),同时将
位图信息置换成每个象素点的灰度值,记录到一个很大的整型数组u里面,接下来对这个数组
进行一个很耗时的计算过程,结束之后,再点Button1,打开第二张图片,点Button2,重复刚才的过程. 现在的问题是想做成多线程,希望前一张图片还在处理的时候,能够打开另一张同时处理,使没有等待的感觉.
我在Form2所在的Unit里定义了线程
Type
Tmythread = class (TThread)
protected
procedure Execute;override;
end;
在Form2所在的Unit里定义了Execute过程,把那个耗时的计算放在这里面并且最开始有语句FreeOnterminent := True;
在Form1所在的Unit里
procedure TForm1.Button2Click(Sender: TObject);
begin
Tmythread.Create(false);
end;
如果是这样的话,等前一张图片计算完之后,再启动第二个线程计算后一张图片,结果是正确的.但若在前一张图片的计算过程中启动了第二张图片的计算,则两张图片都只计算了一部分,感觉第二个线程一启动,前一个就立马结束了(计算并没有完成)
发现这里有很多高手,不知道能不能帮我,谢谢了
 
procedure TForm1.Button2Click(Sender: TObject);
var
tmpThread: Tmythread;
begin
tmpThread := Tmythread.Create(false);
end;
 
To muhx ,我试过这个方法了,还是不行
我怀疑是多个线程同时访问存放图片信息的那个数组u,造成的,我想把那个数组增加
一维u[tp,i],以标记是哪个数组的u,比如第一个线程对应u[1,i],第二个对应u[2,i],那么tp 定义成那种封装程度的好呢
 
问题应该是出现在数组u,
你可以在Form1中定义一个u1,线程内部也定义一个数组u2,执行时把Form1的u1读到u2中,然后再进行耗时计算.
这样还有一些地方需要同步标记,比如要防止这种情况:
执行一次线程,但在执行过程中并没有载入新的图片.....
 
没有做线程同步,两个线程同时对数组操作造成一个写的数据把另一个覆盖了
 
我把数组u 定义成线程的私有变量,还是有不行,
 
后退
顶部