Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];

Вниз

Непонятка с TThread V2.   Найти похожие ветки 

 
NumLock ©   (2004-04-22 19:56) [0]

Всем кто участвовал в предидущей дискусии посвящается:
Разобрался я с материалами, которые Вы мне предоставили, все работает, за исключением одного - мне надо в создаваемом потоке рисовать на битмапе основного потока. Пробовал многие варианты, результат - частые зависания компьютера, глюки в самой среде Delphi (не знаю че она так глючит) и как следствие головная боль.
Я не профи в ООП, по этому прошу совета у Вас.
Заранее благодарен.


 
Тимохов ©   (2004-04-22 19:59) [1]

к ооп это имеет малое отношение.

хорошо бы код видеть?

вопросы:
1. ваша задача - много нарисовать и потом показать все сразу или пользователь должен видеть процесс рисования?
2. вы пользуетесь synchronize?


 
Тимохов ©   (2004-04-22 19:59) [2]

Удалено модератором
Примечание: Дубль


 
NumLock ©   (2004-04-22 20:19) [3]

> Тимохов
Лутше конечно, чтобы процес рисования был виден. synchronize пользовался, объявлял переменную bmp:TBitMap; в рабочем потоке (тот что не VCL) и создавал его (битмап) в конструкторе потока, так по крайней мере вчера ктото советовал. Так же создавал  битмап в VCL потоке, после создания самого потока (ощущается ООП?). Мысль была такая, в робочем потоке рисовать в битмап объявленый в нем же, а потом по synchronize копировать его в битмап и на екран главного потока. Но все эти старания превращались в долгие зависания и чертыхания среды Delphi.
А исходники проги, как только доделаю, собираюсь выложить сюда, все что касалось потоков, я уже вылаживал, там только циклы и расчеты.


 
Romkin ©   (2004-04-22 20:42) [4]

Немного не верно, конструктор потока выполняется в основном потоке. Я бы рекомендовал создавать битмап в execute перед использованием (но это под вопросом). А по синхро - копировать на канвас в основном потоке.
Код какой?


 
panov ©   (2004-04-22 21:02) [5]

>Romkin ©   (22.04.04 20:42) [4]

Копировать на канву можно и в дополнительном потоке. Для этого есть функции Lock и UnLock. Они специально реализованы для многопоточной работы.

>NumLock ©   (22.04.04 20:19) [3]

Если формирование изображения на канве периодическое(т.е. идут достаточно лительные вычисления), то вполне можно и сразу после каждого вычисления копировать изображение, но если идет непрерывное рисование, то лучше копировать толтько после полной отрисовки на TBitmap...


 
NumLock ©   (2004-04-23 14:59) [6]

Вопрос:
Создаю поток, FreeOnTerminate:=false;, он делает свое дело после чего я его не уничтожаю а создаю новый, что при этом происходит?, просто утечка ресурсов, или что?


 
Тимохов ©   (2004-04-23 15:12) [7]


> после чего я его не уничтожаю а создаю новый

происходит утечка


 
NumLock ©   (2004-04-23 15:13) [8]

Вопрос 2:
В Execute рабочего потока рисую на канве PaintBox"а главного (VCL) потока с помощью методов канвы Lock и UnLock:
Form1.pb.Canvas.Lock;
try
   // тут рисую или с помощью BitBlt или с помощью методов канвы
except
   Form1.pb.Canvas.UnLock;    
end;
в результате на екране все прорисовывается но местами не хватает пикселей (они не прорисовываются), почему?
Заранне спасибо


 
Palladin ©   (2004-04-23 16:29) [9]

try
finally
Form1.pb.Canvas.UnLock;
end

так правильней


 
evvcom ©   (2004-04-23 16:42) [10]


> он делает свое дело после чего я его не уничтожаю а создаю
> новый

На создание и удаление потоков уходит довольно много процессорного времени, поэтому лучше поток один раз создать, а потом им "управлять" (усыплять и будить).


 
Андрей Сенченко ©   (2004-04-23 16:53) [11]

evvcom ©   (23.04.04 16:42) [10]

То есть если у меня имеется некая фоновая копировалка периодически возникающих файлов, в которой сам процесс копирования файлов хочу я сделать фоновым - лучше не создавать новый поток и не убивать его сразу после завершения копирования, а просто "будить его" по мере надобности (появления нового файла, который нужно скопировать). Или сильно зависит от частоты появления события "по мере надобности" ? Ресурсы то поток все-равно должен отбирать, даже если он "усыплён"


 
Palladin ©   (2004-04-23 17:04) [12]


> Андрей Сенченко ©   (23.04.04 16:53) [11]

именно зависит от частоты... вообще говоря, не стоит при появлении сразу 50 новых файлов создавать или стартовать 50 потоков, лучьше ограничится некоторым (настраевым естественно) фиксированным количеством потоков что бы они спокойно разобрались с этими 50тью файлами


 
evvcom ©   (2004-04-23 17:06) [13]

Ну что-то типа того. Здесь компромис действительно надо искать между частотой появления файлов и объемом памяти, отведенной под ресурсы потока.
Судя по вопросу и дальнейшим постам, доп.поток автору приходится довольно часто создавать, все-таки рисовалка.


 
Андрей Сенченко ©   (2004-04-23 17:17) [14]

Palladin ©   (23.04.04 17:04) [12]

Кстати попутно ... видимо создам новую ветку когда сам дойду до этого - имена потокам при многопоточном копировании как присваивать ? В TStringList-е или динамическом массиве хранить ?


 
Palladin ©   (2004-04-23 17:33) [15]

а зачем потокам имена? или ты имеешь в виду имена файлов?
при вышеописанном подходе естественно нужно иметь потокобезопасный глобальный список файлов... основной, ну не обязательно основной, любой, поток мониторящий появление новых файлов добавляет в список элементы, и за одно на этот же поток можно повесить мониториг освободившихся потоков-копирователей...

поток-копирователь при успешном завершении копирования, удаляет элемент из списка, на время копирования помечает этот элемент как заблокированный. поток-монитор следит за всем этим делом, стартует освободишиеся потоки-копиры для незаблокированных файлов...

немножко кода, если что то не понятно

PFileToCopy=^TFileToCopy;
TFIleToCopy=Record
 strFileName:String;
 IsLocked:Boolean;
 nFailedCounter:Integer;
End;

Var
cThreads:TObjectList;
cFiles:TThreadList;

и все... дальше реализуем оба вида потоков... заполняем cThreads стартуем поток-монитор..


 
NumLock ©   (2004-04-24 21:03) [16]

> Palladin
С except перепутал.
Глюк с "пропаданиями" пикселов остался, даже если рисовать в собственный (для потока) битмап, а потом выводить его на холст формы (синхронизировано), почему ?


 
nikkie ©   (2004-04-24 22:57) [17]

To draw on the canvas of the PaintBox, write appropriate code in the event handler for the OnPaint event.


 
NumLock ©   (2004-04-26 15:54) [18]

> nikkie
Это ничего не меняет, при рисовании на канве не из основного потока, таких глюков как "пропадание" пикселов нет. Даже если расовть в битмап, тот же глюк.


 
nikkie ©   (2004-04-26 17:24) [19]

>NumLock
ну у тебя ошибка, значит...

объяcняю [17]: если ты и поборешь свои пропадающие точки, то работать нормально у тебя не будет. поскольку TPaintBox должен отрисовываться в OnPaint.

что вообще за затея с рисованием в потоке?


 
NumLock ©   (2004-04-26 22:23) [20]

> nikkie
Фракталы рисую. Прогу уже работает, но я еще ее мучаю, хочется чтобы быстрее рисовалось, потому и суну в поток прорисовку. Прорисовка только TPaintBox"а должна проводится в OnPaint, или это касается всего что содержит канву? Я неиного видоизменил поток, в нем рисую на битмапе (причем его же), потом вывожу на екран, глюк остается, если цикл засовываю в основной поток, то все нормально, но для этого надо Application.ProcessMessage, а это время. Пото, я еще гдето читал что синхронизация нужна тылько для того, к чему может быть паралельный доступ из нескольких потоков, я же на канве рисую или в рабочем потоке или в VCL - синхронизация получается не нужна?


 
Polevi ©   (2004-04-27 08:06) [21]

> [20] NumLock ©   (26.04.04 22:23)
зря ты это затеял
вычисляй в доп. потоке а в основном рисуй с двойным буфером, за глаза скорости должно хватить, имхо


 
NumLock ©   (2004-04-27 16:28) [22]

> Polevi
Ладо, избавлюсь я от этого, но вопрос стоит: почему пикселы не прорисовываются, все ж делаю как должно быть?..


 
Polevi ©   (2004-04-27 16:49) [23]

если тебе приспичило в доп. потоке, делай примерно так

TMyThread.Execute;
begin
 while not Terminated do
 begin
   MakeBitmap;
   Synchronize(DrawIt);
 end;
end

TMyThread.DrawIt;
begin
 CopyBuffer(ThreadBitmap,MainThreadBitmap);
 SomeForm.Invalidate;
end

TSomeForm.OnPaint
begin
 DrawBitmap(MainThreadBitmap)
end

но я не вижу в этом смысла особого..


 
nikkie ©   (2004-04-27 17:17) [24]

>почему пикселы не прорисовываются, все ж делаю как должно быть?..
да кто тебя знает... скорее всего делаешь не так, как должно быть.

>Прорисовка только TPaintBox"а должна проводится в OnPaint, или это касается всего что содержит канву?
рисование на канве вне OnPaint и подобных методов (типа OnDrawItem, OnDrawTab, OnDrawCell) чревато проблемами, которые ты, вероятно, и наблюдаешь. а может твои проблемы вызваны несинхронизированным доступом двух потоков одному битмапу.

в [23] приведена разумная схема. только можешь вызывать DrawIt не только в конце расчета, а несколько раз по ходу дела. например,
(a) при вычислении цвета кадой точки.
(b) при вычислении блока точек, например, одной линии битмапа.
(c) при вычислении нескольких точек, расчет которых занял более 1 секунды (чтобы не дергать картинку слишком часто, как в (a), и чтобы обновление было более или менее равномерным, а не так, как в (c) - черные точки фрактала рассчитываются долго и юзер будет недоумевать, что происходит в момент расчета линии со многими черными точками).


 
NumLock ©   (2004-04-29 16:12) [25]

Вопрос снят спасибо всем.



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

Форум: "Основная";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.038 c
9-1071510959
Yaroslav
2003-12-15 20:55
2004.05.16
С чего начать??? Нужно сделать игрушку.


14-1083132720
Pomoshnik
2004-04-28 10:12
2004.05.16
Delphi


3-1082128389
начинаю
2004-04-16 19:13
2004.05.16
про TIBTable


4-1080229053
cherrex
2004-03-25 18:37
2004.05.16
wh_JournalRecord


7-1081129575
bear9
2004-04-05 05:46
2004.05.16
Printer и Qreport





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский