как понять какие компоненты «не потокобезопасны»? Вот например, я лет пять назад только узнал, что FDMemtable, TMemtableEh таковыми являются. Это можно как-то отличить с первого взгляда или просто знать?
Отсюда второй вопрос: подскажите, как использовать Memtable.LoadFromDataset(……)в главном потоке, при этом, чтобы, например, ProgressBar не замерзал?
Все, кроме тех, у кого ЯВНО написано про потокобезопасность :)
Стикер
Та никак. Почему TMemTableEh в потоке не безопасно? Юзаю без проблем
Никакие
Те, которым ты обеспечиваешь потокобезопасность сам. Или которые явно описанные, как предназначены для организации потоков. Искаропки например TThreadList, TThreadQueue... Со стороны например OmniThread Library
Ну это сами разработчики отвечали мне на форуме, когда я столкнулся с тем, что на слабых машинах были вылеты except и грил был криво отрисован
А зачем создавать экземпляр внутри потока? Передаю в поток MemTableEh и в нём LoadFromDataSet - никаких проблем
Никто в потоке ничего не создает. Лежит на форме и передается в поток
задачи разные бывают же в общем случае TMemTableEh не потокобезопасен
Это простой и достаточно надёжный способ, чтобы компонент все, что он использует, тоже создавал в этом другом потоке. А то мало ли что он использует... Не абсолютно надёжный, но стартовая точка плохая. А то можно взять TMemo и передать в отдельный поток её Lines. А чо таковая я же мемо не трогаю, я же совсем другой объект передал!
Визуальные компоненты реализованы через посылку в Windows сообщений, которое окно будет принимать и обрабатывать в том потоке, который её создал (обычно mainvclthread) Да, с невизуальными компонента и МОЖЕТ быть иначе, но потом ты туда воткнешь событие, событие начнёт дёргать форму, и понеслась душа по кочкам. Поэтому лучше считай, что небезопасно ВСЕ вообще. Потом запутаешься и потратишь в 100 раз больше, чем съэкономишь на неряшливости сегодня
Ну так ты в другом потоке свою очередь обрабатываешь. При этом, твой контрол опять же нельзя использовать из другого потока
Обсуждают сегодня