|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
08.08.2012, 03:08 | #1 |
Участник клуба
Регистрация: 03.12.2009
Сообщений: 1,013
|
Потоки
Доброй - доброй ночи
Если обращаться в потоке напрямую к какому - либо компоненту, то периодически будет вылазить ошибка "Canvas does not allow drawing". Правильно ли я понимаю причину данной ошибки - произошла такая ситуация, именно в этот момент главный поток мог обращаться к компоненту, поправьте пожалуйста если я не прав. Synchronize исправляет данную проблему (тем самым мы передаем обращение к компоненту главному потоку, тем самым не позволим в случае чего обращаться нашему потоку к компоненту) Вызываю данную процедурку и в качестве параметра указываю имя процедуры в которой собственно и буду производить нужные изменения с компонентом. Но вот возникает сразу же такой вопрос, будет ли считаться обращением к компоненту, если я хочу получить значение какого - либо свойства? Могу ли я это делать напрямую из своего потока? Или опять таки нужно применять синхронизацию? P.S. Прошу прощения за такие вопросы, но в моей голове пока что царит туманище по данному вопросу Последний раз редактировалось Базиля; 08.08.2012 в 03:11. |
08.08.2012, 07:04 | #2 |
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
Сильно зависит от реализации свойства, которое ты читаешь. Лучше перестраховаться и выполнять синхронизацию.
Вообще, лучшая синхронизация - это та, которую не нужно выполнять. Твоему потоку нужны какие-то данные для работы? Собери их в кучу до запуска потока и передай потоку параметрами по значению (с копированием). Тогда в потоке будет копия всех необходимых данных, к которой можно обращаться в любой момент без необходимости синхронизации. Если параметры изменяются во время работы потока и потоку нужно знать их актуальное значение, то такой способ не подойдёт. В этом случае лучше всего завести отдельное хранилище переменных (запись или класс с методами Lock/Unlock). В поток передать это хранилище по ссылке (без копирования). Когда потоку нужны значения - он делает Lock, читает параметр, делает Unlock. Когда параметр изменяется (не важно в каком потоке), его значение нужно обновить и в хранилище. Делаем Lock, обновляем, Unlock.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
|
08.08.2012, 13:02 | #3 | |
Участник клуба
Регистрация: 03.12.2009
Сообщений: 1,013
|
GunSmoker
Спасибо за разъяснение! Буду разбираться. Цитата:
А вот как тогда быть если я хочу в потоке добавлять запись в БД, т.е. идет обращение к adoquery или же он не относится к VCL и можно смело к нему обращаться? |
|
08.08.2012, 13:16 | #4 | |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Цитата:
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
|
08.08.2012, 13:25 | #5 | ||
Старожил
Регистрация: 30.12.2009
Сообщений: 11,426
|
Цитата:
Цитата:
к слову у вас есть Memo, нужно загнать текст в поток. В Private потока пишем fStrings:TStringList пишем свойство property Lines:TStringList read fStrings write fStrings; в констукторе и дестррукторе описываем fStrings. До Thread.Resume {Start}; Передаем в Lines потока, Lines от Memo. Thread.Lines.AddStrings(Memo.Lines) |
||
08.08.2012, 19:23 | #6 | |
Участник клуба
Регистрация: 03.12.2009
Сообщений: 1,013
|
Аватар
Благодарю! Человек_Борща Спасибо! Цитата:
|
|
08.08.2012, 19:55 | #7 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,426
|
Создаете синхронизируемое событие с параметрами, где ваш поток и обьект обмениваются данными.
Код:
|
08.08.2012, 21:53 | #8 | ||
Старожил
Регистрация: 20.04.2008
Сообщений: 5,526
|
Цитата:
70% процессорного времени задачи уйдет на бесполезную отрисовку! и 90% обшего времени поток будет простаивать ожидая выполнения бесполезной отрисовки. (ведь отрисовка тебует синхронизации, т.е. остановки потока). Цитата:
Делаем внутрипотоковый объект TStringList. Заносим в него, обрабатываем, и готовые результаты (малую толику) через синхронизацию сбрасываем в основной поток. А там глядишь и поток не нужен будет. TstringList при том же фунционале по обработке строк, работает быстрее TMemo, т.к. ему не надо отвлекаться на дополнительные действия по рисованию себя!
программа — запись алгоритма на языке понятном транслятору
Последний раз редактировалось evg_m; 08.08.2012 в 21:59. |
||
09.08.2012, 22:56 | #9 |
Форумчанин
Регистрация: 11.01.2012
Сообщений: 177
|
если в не главном потоке работать с компонентами через Win API, то никакая синхронизация не нужна, система всё синхронизирует за нас. Сообщения отправляются в очередь в главный поток
progromore.i2p - первый русскоязычный портал программистов в скрытосети
|
10.08.2012, 03:36 | #10 | ||||
Участник клуба
Регистрация: 03.12.2009
Сообщений: 1,013
|
Человек_Борща
Спасибо за подробное описание, вот сидел - сидел, все пытался разобрать этот кусочек кода и вообще что-то ни к чему не пришел, наверное мой багаж знаний еще мал для того чтобы здесь разобраться. С пользовательскими событиями дело еще не имел. Стоит наверное разобраться для начала с ними. Чтобы вникать в этот кусочек. Еще раз спасибо. evg_m Цитата:
Если я в потоке описываю обработку строки и последующее занесение ее в БД, то форма подвисает. Я уже выяснил что вся загвоздка в куске кода: Код:
Цитата:
Убираю в потоке добавление записей - форма не подвисает. Создаю пустой проект - кидаю в поток добавление записей, форма не подвисает. Rock-n-Rolla Цитата:
Цитата:
Спасибо всем кто откликается в теме и помогает мне разобраться в потоках )))) Благодарю! Последний раз редактировалось Базиля; 10.08.2012 в 03:38. |
||||
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Потоки в с# | qwerty74 | C# (си шарп) | 5 | 22.06.2011 13:57 |
Потоки | Killer_Pooh | Общие вопросы Delphi | 4 | 01.06.2011 02:28 |
[C#] Потоки | Lemo | C# (си шарп) | 2 | 24.05.2011 21:50 |
Потоки | fredwriter | Общие вопросы Delphi | 20 | 13.11.2010 04:16 |
потоки | tanek | Помощь студентам | 6 | 15.03.2010 21:42 |