Главная страница
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.025 c
6-3045
TankMan
2003-03-01 15:00
2003.06.02
Люди поможите с ошибкой сокета....


1-3000
Dimich1978
2003-05-21 17:38
2003.06.02
Метод Монте-Карло


1-2860
Жук
2003-05-22 08:38
2003.06.02
Beep при выходе из DBEdit


1-2968
Unknown user
2003-05-19 21:27
2003.06.02
ПРоблема при копировании канвы TCustomControl в TBitmap.Canvas


14-3060
Knight
2003-05-08 09:43
2003.06.02
9 МАЯ