![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Synchronize и критические секции
tippa © (2010-04-10 07:44:00)Можно ли использовать вместо метода Synchronize критические секции? Есть много потоков, в каждом имеется код, изменяющий прогрессбар, и этот код помещен в критическую секцию. То есть 2 потока не могут одновременно изменить прогрессбар, тогда вроде Synchronize и не к чему?
sniknik (2010-04-11 10:49:00) [21]> Через сообщения можно тому, кто умеет понимать сообщения.
а если не умеет, то посылать свое сообщение форме, и уже в нем, в обработчике формы (основном потоке) менять что нужно.
ИМХО, но это гораздо лучше, и удобнее синхронизаций из кучи разных потоков. и тормозов нет, т.к. получается "истинное" асинхронное выполнение. (а с синхронизациями или критическими секциями если много одномоментно то они просто станут в очередь...)
Германн (2010-04-11 02:15:00) [22]
> Да и коряво выглядит.
>
Особенно repeat until false.
Игорь Шевченко (2010-04-11 01:19:00) [23]Через сообщения можно тому, кто умеет понимать сообщения. ProgressBar умеет, Grid - не умеет. Ну и т.д.
Да и коряво выглядит.
sniknik (2010-04-11 00:45:00) [24]> только не очень удобно, и нарушает принципы ООП.
очень удобно. плевать на "принципы ООП" если это чего то там нарушает.
> можно вести только из главного потока, и критические секции никак не помогут
почему это? какая разница если цель, не мешать друг другу, достигнута.
Leonid Troyanovsky (2010-04-11 00:26:00) [25]
> _Юрий © (10.04.10 23:54) [3]
> Через сообщения можно, только не очень удобно, и нарушает
> принципы ООП.
От чего ж?
--
Regards, LVT.
_Юрий (2010-04-10 23:54:00) [26]Через сообщения можно, только не очень удобно, и нарушает принципы ООП.
А любую работу с визуальными компонентами методами VCL можно вести только из главного потока, и критические секции никак не помогут
tippa (2010-04-10 14:39:00) [27]Вот вычитал, что это дело можно замутить через сообщения, по-моему так даже проще.
var HPrBar:hwnd;//хэндл прогрессбара
min,max:integer;//минимальное-максимальное значение
pos:integer;//текущее значение
begin
SendMessage(HPrBar, PBM_SETRANGE, 0,MAKELPARAM(min, max));
repeat
sleep(10000);
SendMessage(HPrBar,PBM_SETPOS, pos, 0);
until false;
end;
MBo (2010-04-10 08:12:00) [28]>То есть 2 потока не могут одновременно изменить прогрессбар, тогда вроде Synchronize и не к чему?
Обращение из вторичных потоков к визуальным контролам надо синхронизировать с основным, ведь, например, система может вызвать перерисовку прогрессбара.