Дабы не создавать новую тему решил спросить здесь.
В Lazarus 0.9.29 не могу найти критические секции. Модуль cobjects (вродеб так он назывался) отсутствует. Где теперь их искать?
Опять потоки
Модератор: Модераторы
можно попробовать так:
1. добавить к проекту глобальные переменные.
2. методом synchronize обновлять глобальные переменные (ну взять числовую переменную и присваивать ей значения от 1 до 100)
3. по таймеру в VCL проверять значение глобальной переменной и относительно ее уже выводить инфу о процентах закачки файла (ну или что там надо)
то есть не работать напрямую с VCL из synchronize
1. добавить к проекту глобальные переменные.
2. методом synchronize обновлять глобальные переменные (ну взять числовую переменную и присваивать ей значения от 1 до 100)
3. по таймеру в VCL проверять значение глобальной переменной и относительно ее уже выводить инфу о процентах закачки файла (ну или что там надо)
то есть не работать напрямую с VCL из synchronize
ronin
А Вы прогресс-бар создайте в том же потоке, где идёт закачка...
А Вы прогресс-бар создайте в том же потоке, где идёт закачка...
VirtUX писал(а):Где теперь их искать?
Уже нашел - LCLType
ronin писал(а):Synchronize использую для отображения прогресса закачки (обращение к VCL), и вывода сообщений пользователю об этапах выполнения загрузки - коннект/загрузка/окончание/ошибки...
можно обойтись без synchronize? в принципе у меня один поток закачки
P.S. во всех источниках что прочитал пугали о синхронизации, о возможности появления ошибок при одновременном обращении к VCL
у себя делал так:
1. в потоке с каждым скаченным блоком отправлял сообщение в окно (используя postmessage) чтобы оно обновило например прогрес бар
2. а окно собственно (обрабатывая сообщение) смотрело жив ли поток и если да, то обновляло прогрес бар свежими значениями
при этом не потребовалось synchronize и критические секции.
- coyot.rush
- постоялец
- Сообщения: 309
- Зарегистрирован: 14.08.2009 08:59:48
eevee 18.03.2010 12:37:49
можно попробовать так:
1. добавить к проекту глобальные переменные.
2. методом synchronize обновлять глобальные переменные (ну взять числовую переменную и присваивать ей значения от 1 до 100)
3. по таймеру в VCL проверять значение глобальной переменной и относительно ее уже выводить инфу о процентах закачки файла (ну или что там надо)
то есть не работать напрямую с VCL из synchronize
+1
На одно ядерных системах можно без synchronize. Потому как или mov eax,some_var[ss] или mov some_var[ss],eax третьего не дано. Плюс для больших вычислительных задач прирост в производительности. С многоядерными не знаю как обстоят дела. Имхо, в многоядерных процессорах с разделяемым L1 кэшем возможны проблемы
спасибо за рекомендации, ну я так и сделал, через переменные
P.S. так и не могу понять почему такие трудности при работе с потоками? почему не доведут всё до ума? или так и должно быть?
P.S. так и не могу понять почему такие трудности при работе с потоками? почему не доведут всё до ума? или так и должно быть?
Код потерялся?Sergei I. Gorelkin писал(а):Ну хотя бы так.
Предполагаю, имелось в виду заменить
Synchronize(VCLMethod)
на
if not terminated
then Synchronize(VCLMethod)
