Reputation: 4168
I must processing one image in main form , but the processing speed is low for inc speed i use thread...
My thread code :
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;
and I'm use it in on timer
:
procedure TForm1.tmr1Timer(Sender: TObject);
var
pThread : TPaintThread ;
begin
pThread := TPaintThread.Create(True) ;
pThread.SetAll(MyBmp,mask,img1);
pThread.Resume ;
pThread.FreeOnTerminate := True ;
end;
but I have error in DoWritePix
in run time :
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)
My question: Is that way correct for edit image in main form or not ? if not what is correct way access and write on thread? if yes how I can solve problem ?
Upvotes: 3
Views: 1175
Reputation: 613043
This code is wrong:
procedure TPaintThread.SetAll(src: TBitmap; msk: TBitmap; img: TImage);
begin
Source := src ;
mask := msk ;
img := img ; // OOPS!
mBit := TBitmap.Create ;
end;
When you write img := img;
you are doing nothing – that is a no-op. You meant to write:
image := img;
And that's why image
is nil
in DoWritePix
which explains the access violation.
Don't be helpless when you face a runtime error. Run the code under the debugger and let the debugger tell you which variable is not initialised.
Upvotes: 8