Форум: "Основная";
Текущий архив: 2003.06.02;
Скачать: [xml.tar.bz2];
ВнизРисование из другог потока Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c