Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.02.2010, 23:13   #1
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию Некорректная работа функции в потоке.

Имеется функции
Код:
procedure Extract(img: TBitMap);
var
  _r, i,j, r,g,b: Integer;
  cl: TColor;
  tmp: TBitmap;
begin
  _r:=51;
  r:=95;
  g:=152;
  b:=169;

  img.SaveToFile('1.bmp');

  for i := 0 to img.Width - 1 do
  begin
    for j := 0 to img.Height - 1 do
    begin
      cl:=img.Canvas.Pixels[i,j];
      if (abs(GetRValue(cl)-r)<_r)
         and (abs(GetGValue(cl)-g)<_r)
         and (abs(GetBValue(cl)-b)<_r)
      then
        img.Canvas.Pixels[i,j]:=clBlack
      else
        img.Canvas.Pixels[i,j]:=clWhite;
    end;
  end;

    img.SaveToFile('11.bmp');

    DeNoise(img);

    img.SaveToFile('111.bmp');
end;
Если её запускать, допустим, по нажатию на кнопке, то всё будет нормально, а если в потоке, то больше чем в 50% случаев получаю "плохой" результат. Скрине ниже
Изображения
Тип файла: bmp 1.bmp (9.4 Кб, 133 просмотров)
Тип файла: bmp 11.bmp (9.4 Кб, 136 просмотров)
Тип файла: bmp 111.bmp (9.4 Кб, 127 просмотров)
TwiX вне форума Ответить с цитированием
Старый 28.02.2010, 00:21   #2
Zeraim
Ra-Ra ?
Форумчанин
 
Аватар для Zeraim
 
Регистрация: 06.03.2008
Сообщений: 286
По умолчанию

Canvas.Pixels не так шустро работает, особенно когда много проходов цикла, может по 5-10 секунд зависать 8)
Попробуй WinAPI, может спасёт.
Zeraim вне форума Ответить с цитированием
Старый 28.02.2010, 01:05   #3
InternetStranger
php / delphi
Форумчанин
 
Аватар для InternetStranger
 
Регистрация: 10.06.2007
Сообщений: 175
По умолчанию

Приведите код потока, где и как именно вызывается эта функция. Если я правильно догадываюсь, то в качестве аргумента передается что-то вроде form1.Image1.Picture.Bitmap.
Напрямую обращаться к VCL - компонентам из дополнительного потока нельзя (они однопоточны). Поэтому и возникают самые разные "непонятности".

Решение:
1) Данную функцию нужно перенести в модуль потока и объявить как его метод. Затем вызывать в рамках синхронизации потока. Что-то вроде этого:
Код:
TThreads = class(...)
      ........
      procedure Extract(img: TBitMap);
      ........
end;

procedure TThreads.Extract(img: TBitMap);
procedure Extract(img: TBitMap);
var
  _r, i,j, r,g,b: Integer;
  cl: TColor;
  tmp: TBitmap;
begin
       ....
end;

// А в исполняемой части потока вызывать ТОЛЬКО в рамках синхронизации

procedure TThreads.Execute;
begin
       .....
       Synchronize (Extract( img_TBitMap )); // Приостановить доп. поток, и синхронизировать его с главным. 
       .....
end;
2) Если нет возможности перенести в модуль потока, то аналогично создается метод-обертка, внутри которого вызывается Extract(...):

Код:
procedure TThreads.Obertka;
begin
       Extract( img );
end;

procedure TThreads.Execute;
begin
       .....
       Synchronize ( Obertka );  
       .....
end;
upd: Прочитал соседний пост. Все равно рекомендую так попробовать.
Synchronize - это не только для работы с VCL, это грамотная синхронизация 2х конкурирующих потоков. Без нее они бесцеремонно будут вклиниваются друг к другу (что и наблюдается у Вас в 50% случаях - как повезет), могут даже прервать обработчики по среди их работы.
G.Azamat { Web Development / Computer simulation }
Начинающий программист думает, что в килобайте 1000 байтов, а законченный уверен, что в километре 1024 метра.

Последний раз редактировалось InternetStranger; 28.02.2010 в 01:17.
InternetStranger вне форума Ответить с цитированием
Старый 28.02.2010, 12:33   #4
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Цитата:
Приведите код потока, где и как именно вызывается эта функция. Если я правильно догадываюсь, то в качестве аргумента передается что-то вроде form1.Image1.Picture.Bitmap.
Нет. В потоке создаётся сам BitMap, в него грузится картинка из jpeg (Assign'ом), полученного при помощи InDy.
TwiX вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Некорректная работа гиперссылок Microsoft Word 2010. steff44 Microsoft Office Word 14 01.02.2013 06:04
mkfifo, некорректная работа (Линукс) IceBreaker Помощь студентам 4 21.03.2012 13:34
работа с TStringList в потоке OPF_Nik Помощь студентам 6 01.02.2010 15:15
Некорректная работа потока 3D Hunter Общие вопросы Delphi 7 09.03.2009 10:51
BDE и DataBase Desktop - некорректная работа в Vista Dux БД в Delphi 9 03.04.2008 23:18