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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.11.2010, 20:19   #1
Crystallon
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 273
По умолчанию Как притормозить основной поток пока не выполнятся все дополнительные?

У моей программы фон это картинка у которой есть прозрачные места, и для того чтобы эти прозрачные места в программе реально были прозрачными я использую такой код:
Код:
  FMain.brush.bitmap:=bg.picture.bitmap;
  nullClr := bg.picture.Bitmap.Canvas.Pixels[0, 0];
  regn := CreateRectRgn(0, 0, bg.picture.Graphic.Width,
  bg.picture.Graphic.Height);
  for x := 1 to bg.picture.Graphic.Width do
    for y := 1 to bg.picture.Graphic.Height do
      if bg.picture.Bitmap.Canvas.Pixels[x - 1, y - 1] = nullClr then
      begin
        tmpRegn := CreateRectRgn(x - 1, y - 1, x, y);
        CombineRgn(regn, regn, tmpRegn, RGN_DIFF);
        DeleteObject(tmpRegn);
      end;
  SetWindowRgn(FMain.handle, regn, true);
Когда изображение очень большое и на нем очень много прозрачных точек вышеуказанная процедура выполняется слишком долго, чего допускать в моем случае никак нельзя, по этому я хочу как-то разделить этот процесс на несколько потоков, происходить это будет примерно так:
например 1 поток будет выполнять эту процедуру для x := 1 to bg.picture.Graphic.Width и y := 1 to bg.picture.Graphic.Height/4, т.е. для верхнего участка изображение если изображение поделить на 4 куска по горизонтали, поток 2 будет выполнять эту процедуру для x := 1 to bg.picture.Graphic.Width и y := bg.picture.Graphic.Height/4 to bg.picture.Graphic.Height/2 т.е. для второго куска сверху итд

Для того чтобы все это сработало как я понимаю необходимо запустить все 4 потока в oncreate и как-то заморозить выполнение oncreate до того как все потоки закончат свою работу, после чего выполнить SetWindowRgn(FMain.handle, regn, true);
Если я в своей "теории" не ошибаюсь подскажите можно ли как-то заморозить поток и как правильней это сделать.
Заранее спасибо

P.S. Если тема обсуждалась ранее прошу прощения, но ни поиск по форуму ни яндекс подходящей информации мне не дали.

Последний раз редактировалось Crystallon; 24.11.2010 в 20:21.
Crystallon вне форума Ответить с цитированием
Старый 24.11.2010, 20:42   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Я немного в недоумении, что касается вопроса в теме, используйте WaitForSingleObject, или Multiple.
BOBAH13 вне форума Ответить с цитированием
Старый 24.11.2010, 21:30   #3
Crystallon
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 273
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
Я немного в недоумении, что касается вопроса в теме, используйте WaitForSingleObject, или Multiple.
Спасибо, вроде разобрался
Crystallon вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запрет сохранения книги пока не заполнены все ячейки Verano naranjo Microsoft Office Excel 8 04.04.2011 10:06
Как оповестить основной поток о каком-то событии в потоке (TThread)? TwiX Общие вопросы Delphi 2 11.02.2010 02:57
Как редактировать основной словарь Ворда? Maria_I Microsoft Office Word 5 19.09.2009 00:09
притормозить прогу |v||v|<<IpShot Общие вопросы C/C++ 3 27.09.2008 17:49
Все висит пока выполняется процедура XPAiN Общие вопросы Delphi 3 07.05.2008 15:03