Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.02;
Скачать: CL | DM;

Вниз

Рисование из другог потока   Найти похожие ветки 

 
sapsi   (2003-05-22 11:53) [0]

Можно ли длительные вычислительные операции и рисование на paintbox основной формы выполнять из создаваемого второго потока?
Будет ли происходить тогда рисование? Или только вычисления?
Что нужно, чтобы запускаемый поток мог рисовать на форме?


 
Palladin ©   (2003-05-22 11:57) [1]

имхо как примерно организовать это в отдельном потоке:
Вычисляй как можно дольше, результаты вычислений заноси во временный массив или еще куда, после накопления данных до некоторого критического размера, выводи их на paintbox при помощи TThread.Synchronize, и расчитывай дальше... тоесть организуй что то вроде кеша...


 
AlexSV ©   (2003-05-22 12:02) [2]

Посмотреть пример Threads в Demos


 
Юрий Зотов ©   (2003-05-22 12:40) [3]

> после накопления данных до некоторого критического размера,
> выводи их на paintbox при помощи TThread.Synchronize,

И в это время вычисления стоят. Тогда зачем вообще второй поток?

Одна из стандартных схем:
- основной поток обрабатывает сообщения (в том числе, рисует);
- второй поток только считает и посылкой сообщения уведомляет первый, что новая порция данных готова (данные можно передавать в том же сообщении).


 
Palladin ©   (2003-05-22 12:42) [4]

да, точно, так будет лучше, когда их два...


 
sapsi   (2003-05-22 13:43) [5]

То есть рисовать из второго потока напрямую невозможно?


 
Palladin ©   (2003-05-22 13:47) [6]

возможно, я же сказал Synchronize, но смысл многопоточности теряется


 
sapsi   (2003-05-22 14:04) [7]

Тогда еще один вопрос.
Допустим, в потоке у меня процедура с параметрами.
Например DOsomething(const S: TStrings; const P: TPaintBox);
Могу ли я и как описать в методе Syncronize эти параметры. Без параметров не компилируется (ошибка: различаются списки параметров).
(В качестве параметров передается Paintbox и Memo), т.е.
так написать нельзя
synchronize(DOsomething(const S: TStrings; const P: TPaintBox))
так как в синхронизации вызывается процедура без параметров
и так тоже
synchronize(DOsomething); - так как здесь я ничего не передаю для расчета.
Как быть в таком случае?
Спасибо.


 
Palladin ©   (2003-05-22 14:12) [8]

начнем с этого: ты пример смотрел в справке?


 
yaJohn ©   (2003-05-22 16:42) [9]

>да, точно, так будет лучше, когда их два...
Только цикл обработки вин-сообщений (где и должно что-либо рисовать приличной программе) уже есть и поток для него создавать не надо :)
В свое время пробегало такое решение:
В ОнПаинт усыпляем (Suspend) поток, берем из него все что хотим и рисуем, после чего снова будим (Resume). Само собой во время рисования поток стоит, но этого трудно избежать, разве что перейти на многопроцессорную технику ;)
Для пущей красоты по таймеру говорим Репаинт.
Теоретически, с данными потока после Suspend можно работать.



Страницы: 1 вся ветка

Текущий архив: 2003.06.02;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.021 c
1-2844
demonyator
2003-05-17 20:01
2003.06.02
Прозрачность в String Grid


1-2889
frits
2003-05-22 16:26
2003.06.02
BitMap


14-3106
novill
2003-05-14 16:02
2003.06.02
Подскажите, где можно найти Service Pack для Delphi5


14-3064
lia
2003-05-16 08:39
2003.06.02
Пример реализации SMTP, POP клиента на паскале...


1-2920
marat111
2003-05-22 19:12
2003.06.02
Перетаскиваемые компоненты