Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.79/19: Рейтинг темы: голосов - 19, средняя оценка - 4.79
0 / 0 / 0
Регистрация: 02.03.2012
Сообщений: 18
1

Потоки (Thread), не могу разобраться

29.05.2012, 22:40. Показов 3634. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Люди-мастера делфи и те кто разбирается, как правильно распоточивать задачи.
Кто сможет помогите. Сделал процедуру которая уменьшает изображение на канве, с более ли менее нормальным качеством, но проблема в том, что при появлении нескольких канвасов на одной форме программа дико тормозит хочется сделать так чтобы процедура уменьшения выполнялась в фоне.
Вот текст процедуры, как убрать в другой поток, основная проблема как вот это (Sender: TObject; s:AnsiString; i:boolean) передать потоку?

Delphi
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
procedure TQTest.AntiA(Sender: TObject; s:AnsiString; i:boolean);
var
   source,buffer:TBitmap;
   Jpg:TJPEGImage;
begin
     if i = true
      then
       begin
        (Sender as TImage).Picture:=nil;
        (Sender as TImage).Canvas.Brush.Color:=clBtnFace;
        (Sender as TImage).Canvas.Brush.Style:=bsSolid;
        (Sender as TImage).Canvas.Rectangle(-2,-2,(Sender as TImage).Width + 2,
                                                  (Sender as TImage).Height + 2);
       end;
 
     source:=TBitmap.Create;
     buffer:=TBitmap.Create;
     Jpg:=TJPEGImage.Create;
     Jpg.LoadFromFile(s);
 
     if ((Sender as TImage).Width / Jpg.Width * Jpg.Height >
         (Sender as TImage).Height / Jpg.Height * Jpg.Width)
      then
       begin
        buffer.Height:=(Sender as TImage).Height;
        buffer.Width:=Round(buffer.Height / Jpg.Height * Jpg.Width);
        if buffer.Width > (Sender as TImage).Width
         then
          begin
           buffer.Height:=Round((Sender as TImage).Width / buffer.Width * buffer.Height);
           buffer.Width:=(Sender as TImage).Width;
          end;
       end;
 
     if ((Sender as TImage).Width / Jpg.Width * Jpg.Height <=
         (Sender as TImage).Height / Jpg.Height * Jpg.Width)
      then
       begin
        buffer.Width:=(Sender as TImage).Width;
        buffer.Height:=Round(buffer.Width / Jpg.Width * Jpg.Height);
        if buffer.Height > (Sender as TImage).Height
         then
          begin
           buffer.Width:=Round((Sender as TImage).Height / buffer.Height * buffer.Width);
           buffer.Height:=(Sender as TImage).Height;
          end;
       end;
 
     source.Assign(Jpg);
     SetStretchBltMode(buffer.canvas.handle,HALFTONE);
     StretchBlt(buffer.canvas.handle,
                0,0,buffer.Width,buffer.Height,
                source.canvas.handle,
                0,0,source.width,source.height,
                SRCCOPY);
     (Sender as TImage).Canvas.Draw(((Sender as TImage).Width - buffer.Width) div 2,
                                    0,buffer);
     source:=nil;
     buffer:=nil;
     Jpg:=nil;
 
     if i = true
      then
       (Sender as TImage).Canvas.Brush.Color:=clWhite;
end;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.05.2012, 22:40
Ответы с готовыми решениями:

Ветви, нити, потоки (Thread’s)
Задание: 1. Выполнить приложение c Thread’ами; 2. Дизайн основной части приложения такой;...

Задали работу, не могу разобраться. Используется делфи 10, не могу разобраться, как это сделать
В одномерном массиве, состоящем из n вещественных элементов, вычислить: минимальный элемент массива...

Как приостановить потоки (Thread-ы) при перемещении формы?
Привет всем. Программа использует 4-и потока которые принимают данные , обрабатывает данные и...

Не могу разобраться с If-ами. Не могу найти ошибку
Только начал знакомство с программированием. Преподаватель задал задание, написать программу в VLC...

20
0 / 0 / 0
Регистрация: 02.03.2012
Сообщений: 18
01.06.2012, 16:29  [ТС] 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от БогДелфей Посмотреть сообщение
Вот пример по твоему коду, только я никак не могу понять, где должно зависнуть
такой код сейчас у меня написан подвисает, когда на форме 6 canvas, например и изображение большое.
Но благодарю за попытку помочь.

Добавлено через 3 минуты
Цитата Сообщение от Wizardzim Посмотреть сообщение
Canvas не является потокобезопасным.
В многопоточных приложениях надо использовать методы канвы Lock и Unlock.
Получается, что смысла в потоках нету.

Попробуйте использовать библиотеку Graphics32 для работы с графикой.
а можно про "Lock и Unlock" поподробней?
про Graphics32 слышал, но руки не дошли(

Добавлено через 15 минут
Всем огромное Благодарю, нашел свой косяк, надо заканчивать ночами не спать, повторял перерисовку несколько раз и забыл стек задач очищать Application.ProcessMessages; вот он и притормаживал. Мда, сделать глупость просто...
0
01.06.2012, 16:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.06.2012, 16:29
Помогаю со студенческими работами здесь

не могу разобраться с потоком (Thread)
не пойму как сделать мне надо создать поток в котором будет выполняться метод если метод...

Не могу разобраться с классом Thread. (пример простой внутри)
class MyThread extends Thread { String str; MyThread (String str) { this.str = str; } ...

Потоки.События.Не могу разобраться
Здравствуйте . Пытался разобраться с синхронизацией нитей , а точнее- с событиями . Нашёл пример :...

Не могу разобраться с exception in thread "main" java.lang.nullpointerexception
Заменить k-й символ слова на заданный символ. С использованием классов Word и Sentence. Eclipse...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
21
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru