비트 맵을 페인팅 속도를 높이려는 것이므로 BITMAP THREAD CLASS과 같은 클래스를 디자인했습니다. 부분적인 이미지의 개별 회화가 완료되면 내 코드가 Thread.done 디자인 SO 여기에 이전 항목을 다음이병합 페인트 비트 맵 페인팅 결과
type
TbmpthreadForm = class(TForm)
.....
THreadImage: TImage;
procedure Button_threadstartClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private-Deklarationen }
procedure ThreadDone(Sender: TObject);
public
{ Public-Deklarationen }
fserver, fdatabasename, ftablename: String;
global_thread_counter: Integer;
XPixel, YPixel: Integer;
Masterbitmap: TBitmap;
end;
var
bmpthreadForm: TbmpthreadForm;
implementation
{$R *.dfm}
procedure TbmpthreadForm.ThreadDone(Sender: TObject);
begin
dec(global_thread_counter);
MyStatusBar.SimpleText := 'Thread Count ->' + IntToStr(global_thread_counter);
Masterbitmap.Canvas.Lock;
with (Sender as TPaintBitmapThread) do
begin
bitblt(Masterbitmap.Canvas.handle, 0, 0, XPixel, YPixel,
bitmap.Canvas.handle, 0, 0, srcand);
THreadImage.Picture.Bitmap.Assign(Masterbitmap);
// lets see local tthread intermediate results and save it to HD
THreadImage.Picture.Bitmap.SaveToFile('c:\temp\myimage' + IntToStr(Index)
+ '.bmp');
end;
Masterbitmap.Canvas.UnLock;
if (global_thread_counter = 0) then
begin
...
end;
end;
procedure TbmpthreadForm.Button_threadstartClick(Sender: TObject);
var
.....
begin
index_max := 2000000;
threadCounter := 10;
Indexdelta := round(index_max/threadCounter);
///
///
....
Masterbitmap.Width := XPixel;
Masterbitmap.Height := YPixel;
for i := 0 to threadCounter - 1 do
begin
n := i * Indexdelta;
m := (i + 1) * Indexdelta;
// just a test sql string ....
sqlstr := 'select * from Mytable where objectindex <' + IntToStr(m) +
' and Objectindex >' + IntToStr(n);
aPaintBitmapThread := TPaintBitmapThread.Create(XPixel, YPixel, ...... , fserver, fdatabasename, ftablename,
sqlstr, i);
aPaintBitmapThread.OnTerminate := ThreadDone;
Memo1.Lines.Add('start thread->' + IntToStr(i));
inc(global_thread_counter);
end;
end;
처럼 간다 나는 reference question 합니다 (Thread.done 절차의 모든 이미지를 병합 할 결과 이미지/Masterbitmap 실행을 실행에서 조금 달라 보이는 것처럼 내 접근 방식은 VCL mainform masterbitmap 복사 스레드 bmp 콘텐츠에 대한 스레드 안전 디자인이 아닌 것 같아 내 코드에서 어떤 오류를 볼 수 없습니다, 무엇입니까 잘못된 ????
추가 질문
Q1 : TPaintBitmapThread 내의 fbitmap은 Thread.create 프로 시저 내에서 TAdoconnection 용으로 작성되었습니다. 주석을 찾았으므로 thread.execute 내에 만들어야합니다. 이 또한 비트 맵을 완료해야합니까?
Q2는 다음 첨부 된 이미지 (하여 THreadImage.Picture.Bitmap.SaveToFile 명령 된 것과 같이)는 나사와 실제 이미지 결과에 의한 화상 (비트 맵)의 예상 된 결과
XPixel 및 YPixel에 대해 자세히 알려주십시오. 왜 우리는 완전한 프로그램을 가질 수 없습니까? –
완전한 코드는 꽤 길다. Xpixel 및 ypixel은 스레드 내의 비트 맵 크기이며 masterbitmap에도 같은 크기를 사용합니다. 내 bitblt comand와 함께 난 그냥 마스터 bmp로 로컬 스레드 bmp를 복사 – user1769184
나는 완전한 코드를보고 싶지 않아요. 나는 그 문제를 보여주는 완전한 프로그램을보고 싶다. SSCCE. –