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

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

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

Студворк — интернет-сервис помощи студентам
Люди-мастера делфи и те кто разбирается, как правильно распоточивать задачи.
Кто сможет помогите. Сделал процедуру которая уменьшает изображение на канве, с более ли менее нормальным качеством, но проблема в том, что при появлении нескольких канвасов на одной форме программа дико тормозит хочется сделать так чтобы процедура уменьшения выполнялась в фоне.
Вот текст процедуры, как убрать в другой поток, основная проблема как вот это (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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.05.2012, 22:40
Ответы с готовыми решениями:

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

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

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

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

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

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

Добавлено через 15 минут
Всем огромное Благодарю, нашел свой косяк, надо заканчивать ночами не спать, повторял перерисовку несколько раз и забыл стек задач очищать Application.ProcessMessages; вот он и притормаживал. Мда, сделать глупость просто...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.06.2012, 16:29

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
21
Ответ Создать тему
Новые блоги и статьи
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru