Главная страница
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.017 c
14-3177
Ronin
2003-05-14 22:34
2003.06.02
Как убить процесс?


1-2957
alpa
2003-05-21 10:13
2003.06.02
Реестр


11-2832
Kirill
2002-09-04 12:14
2003.06.02
Завершение строки в Editbox е


7-3197
Intell
2003-03-30 14:33
2003.06.02
Как поменять приоритет TTimer?


4-3228
Ик сик
2003-04-03 15:23
2003.06.02
Программно нажать клавишу