Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.11.21;
Скачать: [xml.tar.bz2];

Вниз

tthread замучил   Найти похожие ветки 

 
Maxim____   (2004-11-05 10:48) [0]

Загрузку превьюшек написана в потоке,
потому что открытие большого файла занимет много времени.
но как только двинешь мышкой, всё рушится,
битмапы то белые то никакие.
для того чтобы понять что с битмапом, пытался
сохранить его в цикле в файл,
получаю сообщение что такой файл уже есть,
хотя его нет, и вылет.
Всё что можно было вынести в synchronize вынес,
что ж  ещё и загрузку картинки туда же вынести?
тогда какой смысл в потоке?
или что из-за этих битмапов создавать criticalsection?
Столько суеты из-за bm.loadfromfile.

Скажите, как быть?
Третий день получаю белые битмапы и ничего не могу понять.

type tloadimages = class(TThread)
       ii: integer;
       iW, iH: integer;
       tempbmin, tempbmout: tbitmap;
       sfm, sthfm, wthfm: string;
       oimgW, oimgH: integer;
   private

   protected
       procedure Execute; override;
       procedure imgHandling;
       procedure fillVars;
   end;

procedure tloadimages.Execute;
var i: integer;
begin
   for i := 0 to high(imgs) do begin
       ii := i;
       synchronize(fillvars);
       tempbmin := tbitmap.Create;
       tempbmin.PixelFormat := pf24bit;
       tempbmout := tbitmap.Create;
       tempbmout.PixelFormat := pf24bit;
       loadbitmapfromfile(tempbmin, sfm);
//         tempbmin.savetofile("c:\temp\"+inttostr(i)+".bmp");
       decreaseimage(tempbmin, tempbmout, oimgW, oimgH);
       tempbmout.SaveToFile(sthfm);
       tempbmout.SaveToFile(wthfm);
       iW := tempbmIn.Width;
       iH := tempbmIn.Height;

       synchronize(imgHandling);
       tempbmin.Free;
       tempbmout.Free;
       if terminated then break;
   end;
end;

procedure tloadimages.fillVars;
begin
   sfm := imgs[ii].sourceFM;
   sthfm := imgs[ii].sourceTHfm;
   wthfm := imgs[ii].workcopyTHfm;
   oimgW := form1.oimage.width;
   oimgH := form1.oimage.height;
end;

procedure tloadimages.imgHandling;
var r: trect;
   w, h: integer;
begin
   with imgs[ii] do begin
       image.picture.bitmap.Assign(tempbmout);
       imgW := iW;
       imgH := iH;
       w := image.picture.Width;
       h := image.picture.Height;
       r.Left := (panel.Width - w) div 2;
       r.Top := ((form1.oimage.boundsrect.Bottom - form1.oimage.top) - h) div 2 + form1.oimage.Top;
       r.Right := r.left + w;
       r.Bottom := r.Top + h;
       image.Picture.Bitmap.PixelFormat := pf24bit;
       image.BoundsRect := r;
       image.Show;
       panel.show;
       panel.Invalidate;
   end;
end;


 
Maxim____   (2004-11-05 11:20) [1]

tempbmin.PixelFormat := pf24bit
вроде не safe
убрал везде,
пробовал criticalsection
ничего не помогает!
help!


 
kaZaNoVa ©   (2004-11-05 11:28) [2]

Maxim____   (05.11.04 11:20) [1]
у меня тоже были косяки в связке Thread & VCL ..  забил .. перешёл на апи . :)


 
Maxim____   (2004-11-05 13:18) [3]

т.е. вы предлагаете мне загрузку картинки на низком уровне писать?
это сильно усложняет задачу.
а зачем тогда tthread?


 
kaZaNoVa ©   (2004-11-05 13:47) [4]

Maxim____   (05.11.04 13:18) [3]
не ..  я не это имел ввиду .. просто я тогда эту проблему так и не решил и забил на неё ;)


 
Maxim____   (2004-11-05 14:07) [5]

я не могу забить на проблему, проблему необходимо решить.

как же мне быть?
писать  tbitmap.loadfromfile и    
(tjpegimage,ttiffimage).loadfromfile
руками очень сложно,
просто не хватит времени,
может быть можно заставить работать tthread?


 
Maxim____   (2004-11-05 15:15) [6]

написал:

tempbmin.Canvas.Lock;
loadbitmapfromfile(tempbmin, sfm);
tempbmin.Canvas.Unlock;


и проблема исчезла, теперь и при двигании мыши
всё грузится нормально.
БРЕД!  какое основному потоку дело до скрытого битмапа???
я всегда думал что canvas.lock - необходимая вещь для визуальных компонентов, но для  скрытого битмапа - зачем?????


 
Maxim____   (2004-11-05 18:04) [7]

народ! где же ваши соображения по теме?
проблемы конечно нет,
но такого быть не должно!


 
Maxim____   (2004-11-05 19:42) [8]

может быть я в маразме
и то о чём я пытаюсь с вами говорить
не актуально или слишком очевидно???
напишите же хоть что-нибудь в ответ


 
kaZaNoVa ©   (2004-11-05 20:14) [9]

Maxim____   (05.11.04 19:42) [8]

> напишите же хоть что-нибудь в ответ

:)))
написал ;)))


 
Defunct ©   (2004-11-05 20:33) [10]

> народ! где же ваши соображения по теме?

А какие тут соображения, вы рассказываете какие-то небылицы.
Убедитесь сами:

unit ThreadtestUI;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ExtCtrls;

type
 TForm1 = class(TForm)
   Image1: TImage;
   Button1: TButton;
   OpenDialog1: TOpenDialog;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
   procedure PreviewBitmap( Sender: TObject);
 end;

 TLoader = class(TThread)
 private
   bmp       : TBitmap;
   FFileName : TFileName;
 protected
   procedure Execute;override;
 public
   property Bitmap: TBitmap read bmp;

   constructor Create(AFileName: TFileName);
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

constructor TLoader.Create;
begin
 FFileName := AFileName;
 FreeOnTerminate := True;
 inherited Create(True);
end;

procedure TLoader.Execute;
begin
 Bmp := TBitmap.Create;
 Try
   Bmp.LoadFromFile( FFileName );
   if Assigned(OnTerminate) then OnTerminate(Self)
 Finally
   OnTerminate := nil;
   Bmp.Free;
 End;
end;

procedure TForm1.PreviewBitmap;
begin
 if Sender is TLoader then
 with TLoader(Sender) do
 if Assigned(Bitmap) then
    Image1.Canvas.StretchDraw(Image1.ClientRect, Bitmap);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 if OpenDialog1.Execute then
 begin
   with TLoader.Create( OpenDialog1.FileName ) do
   begin
     OnTerminate := PreviewBitmap;
     Resume;
   end;
 end;
end;

end.


 
Defunct ©   (2004-11-05 20:36) [11]

DFM к модулю [10]

object Form1: TForm1
 Left = 173
 Top = 152
 Width = 672
 Height = 498
 Caption = "Form1"
 Color = clBtnFace
 Font.Charset = DEFAULT_CHARSET
 Font.Color = clWindowText
 Font.Height = -11
 Font.Name = "MS Sans Serif"
 Font.Style = []
 OldCreateOrder = False
 PixelsPerInch = 96
 TextHeight = 13
 object Image1: TImage
   Left = 8
   Top = 8
   Width = 433
   Height = 457
 end
 object Button1: TButton
   Left = 456
   Top = 8
   Width = 75
   Height = 25
   Caption = "Button1"
   TabOrder = 0
   OnClick = Button1Click
 end
 object OpenDialog1: TOpenDialog
   Filter = "Bitmap|*.bmp"
   Left = 456
   Top = 48
 end
end


 
Defunct ©   (2004-11-05 20:48) [12]

Немного подправил модуль, так будет правильнее:

unit ThreadtestUI;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ExtCtrls;

type
 TForm1 = class(TForm)
   Image1: TImage;
   Button1: TButton;
   OpenDialog1: TOpenDialog;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
   procedure PreviewBitmap( Sender: TObject);
 end;

 TLoader = class(TThread)
 private
   bmp       : TBitmap;
   FFileName : TFileName;
   procedure SyncOnTerminate;
 protected
   procedure Execute;override;
 public
   property Bitmap: TBitmap read bmp;

   constructor Create(AFileName: TFileName);
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

constructor TLoader.Create;
begin
 FFileName := AFileName;
 FreeOnTerminate := True;
 inherited Create(True)
end;

procedure TLoader.SyncOnTerminate;
begin
 if Assigned(OnTerminate) then OnTerminate(Self)
end;

procedure TLoader.Execute;
begin
 Bmp := TBitmap.Create;
 try
   Bmp.LoadFromFile( FFileName );
   Synchronize( SyncOnTerminate )
 finally
   OnTerminate := nil;
   Bmp.Free
 end
end;

procedure TForm1.PreviewBitmap;
begin
 if Sender is TLoader then
    with TLoader(Sender) do
      if Assigned(Bitmap) then
         Image1.Canvas.StretchDraw(Image1.ClientRect, Bitmap)
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 if OpenDialog1.Execute then
 begin
   with TLoader.Create( OpenDialog1.FileName ) do
   begin
     OnTerminate := PreviewBitmap;
     Resume
   end
 end
end;

end.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.11.21;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.04 c
1-1099606985
Кто---то
2004-11-05 01:23
2004.11.21
Какая стандартная функция в Дельфи не переводит строку во Float,


1-1099905372
Relaxxx
2004-11-08 12:16
2004.11.21
Подскажите как мне з строки вырезать все символы перевода строки


1-1099468244
denis24
2004-11-03 10:50
2004.11.21
получение Dataset.name


8-1092242740
miek
2004-08-11 20:45
2004.11.21
GLScene: вопросы N2


1-1099657062
Hadroran
2004-11-05 15:17
2004.11.21
Zoom for Image





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский