Главная страница
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.02 c
1-2889
frits
2003-05-22 16:26
2003.06.02
BitMap


14-3098
OlegBat
2003-05-14 09:37
2003.06.02
Есть спецы по EhLib - конкретнее по DBGridEh ?


3-2746
Ж. Александра
2003-05-08 21:33
2003.06.02
база DBF сохранение и открытие.


9-2730
VitGun
2002-12-19 21:32
2003.06.02
Спрайт


3-2781
Vovik
2003-05-13 14:41
2003.06.02
Подсветка SQL-синтаксиса