Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Тормоза с чтением каритнки в VCL вторым потоком [D7, Win2k]


Kogor ©   (2004-10-20 13:35:00) 

Привет всем!
Проблема такая. Использую набор VCL CoolControls, в частности CoolScrollingText Он находится в основном потоке на главной форме. Основной поток занимается тем что прокручивает в этой компоненте некий текст. Второй поток занимается тем что слушает директорию и когда в ней появляется файл (жипег, размер гдето 1 - 3Мб) загружает его в VCL CoolImages (почти тоже самое что и ImageList) используя процедуру LoadFromFile(наследована из TPicture). Дык вот сама проблема в том, что когда я читаю картинку в память скроллинг начинает нещадно тормозить... так как загрузка проца вторым потоком прыгает до 100% Пробовал понизить приоритет, таже фигня. Есть какие нибудь идеи как разрешить проблему? Скроллинг не должен тормозить ни в коем случае...  Может есть какие совсем другие варианты загрузки жипега и последующего его вывода на экран?
Заранее всем спасибо за советы!
Горбунов Константин


Kogor   (2004-10-20 16:34:00) [1]

в общем то ничего не обычного нету

IsItNewFile - заменил часть кода этой функцией, а вообще она опеределяет новый ли файл и если он новый то вставляем в CoolImages

procedure TPicDirThread.Execute;
var
 R: Cardinal;
 f: THandle;
begin
 f := FindFirstChangeNotification(PChar(strDirToMonitor), false, FILE_NOTIFY_CHANGE_FILE_NAME);
 try
   if  f <> INVALID_HANDLE_VALUE then
   begin
     repeat
       R := WaitForSingleObject(f, INFINITE);
       if R = WAIT_OBJECT_0 then
       begin
         if IsItNewFile then               ThreadCoolImages.Images.Add.Picture.LoadFromFile(strPicPath);
       end;
       if not FindNextChangeNotification(f) then Break;
     until Terminated;
   end;
 finally
   FindCloseChangeNotification(f);
 end;
end;


Digitman   (2004-10-20 16:11:00) [2]

приведи полный код метода Execute доп.треда ... ну или хотя бы то место в коде, где идет обращение к файлу для его чтения методом loadFromFile


Kogor   (2004-10-20 16:01:00) [3]

А может написать самому процедуру загрузки картинки в память а потом из памяти уже выгружать в VCL Тогда в процессе загрузки файла я могу приостанавливать процесс считывания и распеделить процессорное время между потоками. Только вот как рочитать файл в память а потом его еще и загрузить в TPicture? Можно как то использовать LoadFromStream?


Digitman   (2004-10-20 13:56:00) [4]


> причем здесь он?


ни при чем.
просто будь уверен в декларированных тобой утверждениях.

а по сабжу  - файловые операции на уровне системы (LoadFromFile стартует именно таковую операцию) имеют весьма высокий приоритет


Kogor   (2004-10-20 13:52:00) [5]

В общем то да, так оно и есть, он создает дополнительный поток который и крутит текст. Просто я об этом не написал. А причем здесь он?


Digitman   (2004-10-20 13:45:00) [6]


> Основной поток занимается тем что прокручивает в этой компоненте
> некий текст


не верю.
скорей всего CoolScrollingText неявно создает доп.трэд, собственно и "крутящий" текст, а осн.трэд занят только визуализацией очер.кадра, построенного доп.трэдом


Наверх

Титульная страница Поиск, карта сайта Написать письмо