Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.03.2012, 22:55   #1
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию небольшой вопрос про TThread

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

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

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

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


что думаете по поводу такой системы?
xrob вне форума Ответить с цитированием
Старый 22.03.2012, 23:00   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
что думаете по поводу такой системы
А смысл? Что поменяется в лучшую сторону? Лишний поток и все усложнится
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.03.2012, 23:10   #3
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

смысл: запуск синхронизации из основного потока добавляет гемора.
хотелось бы упростить использование таблицы, сделать ее более универсальной.
чтобы из любого объекта, любого потока работать с ней и не знать проблем.
xrob вне форума Ответить с цитированием
Старый 23.03.2012, 16:46   #4
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Цитата:
во время синхронизации останавливаются ВСЕ потоки в программе.
Если имеется ввиду TThread.Synchronize - нет. Когда поток дёргает Synchronize - он приостанавливается, метод выполняется в контексте главного потока, возвращает управление, поток возобновляется. Пока Synchronize не вернёт управление - "висит" программа и вызвавший поток, но остальные в это время работают. В D2009 добавили очереди, когда вызвавший поток отдаёт синхронизируемый метод главному потоку и продолжает выполнение.

Цитата:
что думаете по поводу такой системы?
Я ни черта не понял Если не стоит задача распараллелить обработку данных или выполнить в фоновом режиме какую-то медленную операцию, то ни к чему усложнять себе жизнь.
пыщь

Последний раз редактировалось JTG; 23.03.2012 в 16:55.
JTG вне форума Ответить с цитированием
Старый 23.03.2012, 18:16   #5
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

задача банальна как никогда - чтобы прога работала, а форма не висела.
но если с Synchronize останавливается только вызвавший поток,
то моя система работать не будет...
xrob вне форума Ответить с цитированием
Старый 23.03.2012, 22:08   #6
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Автор, читайте теорию про потоки и разбирайте простейшие примеры. Все работает на потоках отлично, причем у всех, кто ими пользуется. 95% вашего кода выполняется современными процессорами за миллисекунды. Вы этих зависаний не увидите в жизни. Компилятор не дурак, оптимизирует код еще как.
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 24.03.2012, 05:00   #7
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
обдумывая логику такого алгоритма, пришел к выводу что
во время синхронизации останавливаются ВСЕ потоки в программе.
я правильно думаю?
Нет, с чего вы взяли?

Если в программе есть 10 потоков и из них один держит какой-то ресурс, а ещё два потока запрашивают к нему доступ, то два потока будут стоять, а 8 потоков - работать.

Цитата:
допустим в каком-то потоке выполняются какие-то операции
и их результат отображается в таблице (добавляется ячейка),
таблица при этом перерисовывается.
Потоку достаточно упаковать порцию данных в сообщение и отправить его главному окну. Сам он продолжит работать дальше, а главное окно параллельно примет сообщение и отобразит данные в гриде.

Цитата:
т.е. допустим таблица имеет свой поток, существующий на протяжении жизни таблицы.
VCL однопоточна. Нельзя обращаться к визуальным компонентам вне главного потока.

Цитата:
задача банальна как никогда - чтобы прога работала, а форма не висела.
См. http://www.delphikingdom.ru/asp/view...catalogid=1355
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Небольшой вопрос про структуру Jack125 Общие вопросы C/C++ 4 08.03.2012 14:15
Вопрос по TThread Федеор Общие вопросы Delphi 6 14.11.2010 16:52
Небольшой вопрос про массив grave123 Общие вопросы C/C++ 8 06.12.2009 16:46
Вопрос наверное про функции, а так точно даже не знаю про что. (Вопрос начинющего #6) Albert2008 Общие вопросы Delphi 4 21.08.2008 15:33