Синхронизация Нити для обработки изображений Дельфи

Я должен, обрабатывая одно изображение в главной форме, но скорость обработки низкая для inc скорости, я использую нить...

Мой код нити:

type
  TPaintThread = class(TThread)
    Source,Mask :TBitmap ;
    image : TImage;
    public
       procedure SetAll(src,msk:TBitmap;img:TImage);
    private
     procedure  DoWritePix;
    var
       mBit : TBitmap ;

    protected
      procedure Execute; override;
  end;

implementation

procedure TPaintThread.SetAll(src: TBitmap; msk: TBitmap; img: TImage);
begin
      Source := src ;
      mask := msk ;
      img := img ;
      mBit := TBitmap.Create ;
end;

procedure TPaintThread.DoWritePix;
begin
  image.Picture.Bitmap := mBit ;
end;

procedure TPaintThread.Execute;
var
    i: Integer;
    j: Integer;
begin
  mBit.Width := Source.Width ;
  mBit.Height := Source.Height ;
  for i := 1 to Source.Width do
    for j := 1 to Source.Width do
    begin
     //my processing event
    end;
   //result := mBit ;
   //write on form image 
    Synchronize(DoWritePix);
end;

и я - использование это в на таймер :

procedure TForm1.tmr1Timer(Sender: TObject);
var
    pThread  : TPaintThread ;
begin
  pThread := TPaintThread.Create(True) ;
  pThread.SetAll(MyBmp,mask,img1);
  pThread.Resume ;
  pThread.FreeOnTerminate := True ;
end;

но у меня есть ошибка в DoWritePix во время выполнения:

First chance exception at $005A81DE. Exception class $C0000005 with message 'access violation at 0x005a81de: read of address 0x000001b8'. Process myexe.exe (6032)
First chance exception at $754E9617. Exception class EAccessViolation with message 'Access violation at address 005A81DE in module 'myexe.exe'. Read of address 000001B8'. Process myexe.exe (6032) 

Мой вопрос: тот путь правилен для, редактируют изображение в главной форме или нет? если не, что такое правильный путь доступ и пишет на нити? если да, как я могу решить проблему?

3
добавлено
Просмотры: 2
nl ja de
Набор ' FreeOnTerminate' прежде чем вы возобновитесь. Нить может выполнить и закончиться перед урегулированием хитов выполнения линия FreeOnTerminate. На самом деле don' t резюме использования вообще, обратитесь к документации для почему..
добавлено автор Sertac Akyuz, источник

1 ответы

Этот код неправильный:

procedure TPaintThread.SetAll(src: TBitmap; msk: TBitmap; img: TImage);
begin
  Source := src ;
  mask := msk ;
  img := img ;//OOPS!
  mBit := TBitmap.Create ;
end;

Когда вы пишете img: = img; вы ничего не делаете – который является нет. Вы хотели писать:

image := img;

И вот почему , который изображение ноль в DoWritePix , который объясняет нарушение прав доступа.

Не будьте беспомощны, когда вы столкнетесь с ошибкой периода выполнения. Управляйте кодом под отладчиком и позвольте отладчику сказать вам, какая переменная не инициализируется.

8
добавлено