powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Synchronize
5 сообщений из 5, страница 1 из 1
Synchronize
    #40055491
Ildar007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.

Я ожидал то, что у меня прогресс бар из процедуры Runparalel будет работать( будет осуществляться визуальная имитация процесса загрузки), а по факту форма просто виснет.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
unit UnitImageConvertor;

interface

uses
  System.SysUtils,
  System.Classes,
  System.Threading,
  System.SyncObjs,
  System.Math,
  Vcl.Imaging.jpeg,
  Vcl.Graphics,
  Vcl.Imaging.pngimage,
  Vcl.FileCtrl;


type
  TArryNameFile = array of string;

  TMyThread = class(TThread);
  MyClass = class(TObject);
  //private
  //FResult: Int64;


procedure RunParalel(const AArraySourceNameFile, AArrayFinishNameFile: TArryNameFile;
  const ALengthArray: Integer);


function LoadImageFromFile(const ASourceNameFile: PChar): THandle;
procedure SaveImageToFile(const AImageHandle: THandle; AFinishNameFile: PChar);
procedure FreeImage(const AImageHandle: THandle);

procedure PositionProgressBar;

var
  Position: Integer;

implementation

uses
  FiveProgect;




function LoadImageFromFile(const ASourceNameFile: PChar): THandle;
var
  LBmpFile: TBitmap;
  LJPEGFile: TJPEGImage;
  LPngFile: TPNGObject;

begin
  LBmpFile := TBitmap.Create;

  if AnsiUpperCase(ExtractFileExt(string(ASourceNameFile))) = '.BMP' then
  begin
    try
      LBmpFile.LoadFromFile(string(ASourceNameFile));
      Result := THandle(LBmpFile);
    finally
    end;
  end
  else if (AnsiUpperCase(ExtractFileExt(string(ASourceNameFile))) = '.JPG') then
  begin
    LJPEGFile := TJPEGImage.Create;
    try
      LJPEGFile.CompressionQuality := 100;
      LJPEGFile.LoadFromFile(string(ASourceNameFile));
      LBmpFile.Assign(LJPEGFile);
      Result := THandle(LBmpFile);
    finally
      LJPEGFile.Free;
    end;
  end
  else if (AnsiUpperCase(ExtractFileExt(ASourceNameFile)) = '.PNG') then
  begin
    LPngFile := TPNGObject.Create;
    try
      LPngFile.LoadFromFile(ASourceNameFile);
      LBmpFile.Assign(LPngFile);
      Result := THandle(LBmpFile);
    finally
      LPngFile.Free;
    end;
  end;

end;

procedure SaveImageToFile(const AImageHandle: THandle; AFinishNameFile: PChar);
var
  LBmpFileSource: TBitmap;
  LJPEGFile: TJPEGImage;
  LPngFile: TPNGObject;
begin
  LBmpFileSource := TBitmap(AImageHandle);
  if AnsiUpperCase(ExtractFileExt(AFinishNameFile)) = '.BMP' then
  begin
  LBmpFileSource.SaveToFile(AFinishNameFile)
  end
  else if AnsiUpperCase(ExtractFileExt(AFinishNameFile)) = '.JPG' then
  begin
    LJPEGFile := TJPEGImage.Create;

    try
      LJPEGFile.Assign(LBmpFileSource);
      LJPEGFile.SaveToFile(AFinishNameFile);
    finally
      LJPEGFile.Free;
    end;

  end
  else if AnsiUpperCase(ExtractFileExt(AFinishNameFile)) = '.PNG' then
  begin
    LPngFile := TPNGObject.Create;

      try
        LPngFile.Assign(LBmpFileSource);
        LPngFile.SaveToFile(AFinishNameFile);
      finally
        LPngFile.Free;
      end;

  end;
end;

procedure FreeImage(const AImageHandle: THandle);
begin
  TObject(AImageHandle).Free;

end;

procedure RunParalel(const AArraySourceNameFile, AArrayFinishNameFile: TArryNameFile;
  const ALengthArray: Integer);
var
  LHandleImage: THandle;
  //Myjb: TThread;

begin
  Form1.ProgressBarConvert.Max := ALengthArray;
  Form1.ProgressBarConvert.Position := 0;
  //Myjb := TThread.Create(true);

  TParallel.For(0,  ALengthArray-1, procedure(I : integer)
    var
      FileName: string;
    begin

     //
      FileName := AArraySourceNameFile[i];
      LHandleImage:= LoadImageFromFile(Pchar(FileName));

      if LHandleImage > 0 then
      begin
        SaveImageToFile(LHandleImage, PChar(AArrayFinishNameFile[i]));
        //Position := I;
        TThread.Synchronize(nil ,
        procedure
        begin
        Form1.ProgressBarConvert.Position := I;
        end);
        //PositionProgressBar
      end;


    end
   );
end;

procedure PositionProgressBar;
var
My: TMyThread;
begin
  My := TMyThread.Create;
  Form1.ProgressBarConvert.Position := Position;
  My.FreeOnTerminate := True;
end;

end.

...
Рейтинг: 0 / 0
Synchronize
    #40055498
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ildar007,

нажми на Pause и посмотри где какой поток висит и чего ждет, переключаться между потоками в окне Threads.
присвоение позиции лучше заменить на Form1.ProgressBarConvert.Step что ли, точно не помню, потоки могут заканчиваться в разнобой, сначала 9ый, потом 1ый
...
Рейтинг: 0 / 0
Synchronize
    #40055500
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ildar007,

кстати, проверь ALengthArray, равен ли он длине массивов (Length(AArraySourceNameFile)) и не отличаются ли длины у двух массивов.
...
Рейтинг: 0 / 0
Synchronize
    #40055504
registered
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TParallel.For performs a threaded execution of the iteration events, but itself is a blocking method. So for this you will have to be careful with the synchronization, if you start this from the main thread.

The use of TThread.Queue works safely but as you already noticed, all the queued events are processed after TParallel.For has finished - in fact, after leaving the method and return to idle.

The use of TThread.Synchronize will cause a dead lock, if you use it in the iteration events and start TParallel.For from the main thread.
...
Рейтинг: 0 / 0
Synchronize
    #40055650
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ildar007
Я ожидал то, что у меня прогресс бар из процедуры Runparalel будет работать( будет осуществляться визуальная имитация процесса загрузки), а по факту форма просто виснет.
Как вы вызываете Runparalel мы должны угадать?
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Synchronize
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]