![]() |
|
#1
|
|||
|
|||
![]() Добрый день.
Научите, плиз, как с потоками работать. Есть у меня какая то статья, да и пример в демосах смотрел - ну не понятен мне принцип. Объясните на двух пальцах и, если можно, дайте самый простейший пример создания потока. Главное не понятно, хотел в потоке реализовать просмотр gif-а, а здесь говорят, что его нельзя в поток совать - так как же тогда вообще с потоками работать? |
#2
|
|||
|
|||
![]() Тебе TThread?
Ну, собственно, проблема в том, что в общем случае из потока на экран лучше вообще ничего не показывать. Хотя если очень хочется, то можно (см. в сторону Canvas.Lock и Synchronize). В общем теория такова. Поток, по сути это некоторая процедура, которая выполняется независимо от основной программы (оносительно независимо). Мастер Дельфей создает для тебя обертку - потомок от TThread, в котором тебе надо собственно реализовать содержимое этой самой функции. Для упрощения можно представить, что поток - это некоторая отдельная программа, выполняющаяся паралельно с твоей основной. Но программа, НЕ ИМЕЮЩАЯ ОКНА. Т.е. ты там можешь делать все, что угодно, но для вывода на экран ты должен будешь обратиться к основной программе. Потоки делают 2х видов. 1. Для однократного выполнения. Такой поток выполняет задачу и самоуничтожается. 2. Поток, который работает постоянно. В этом случае, обычно, поток создается при старте приложения, уничтожается вместе с приложением. в процессе работы приложения может быть "усыплен", а потом восстановлен. Управление таким потоком обычно осуществляется с помощью его свойств. Еще надо посмотреть в сторону объектов синхронизации, т.е. объектов, обеспечивающих защиту данных. CriticalSection тебе тут в помощь. Если кратко, то это все. А дальше смотри примеры, читай хелп и пробуй. Целый учебник тут писать никто не будет. |
#3
|
|||
|
|||
![]() спасибо за ответ. сегодня нашел книжку, вроде там что то про потоки есть. просто интересно, вот например я хочу в поток выделить обращение к базе данных. во-первых, там каждый раз должны подменяться запросы, а во-вторых, ведь процесс отображения данных выборки должен будет производиться на главной форме (соответственно в главном потоке) и взаимодействовать с компонентами для выборки и отображения данных. а в самом потоке вроде как с компонентами взаимодействовать нельзя. значит придется синхронизироваться после выполнения каждого потока.
|
#4
|
|||
|
|||
![]() можно сделать так.
1. От интерфейса отцепляешь датасет. 2. Запускаешь поток, и передаешь ему ссылку на датасет и запрос. 3. Когда все завершится, поток должен сообщить главному приложению, что все готово и "умереть". 4. По получении сообщения от потока (можно сообщением, можно кал-бэком) обратно прицепляешь интерфейс к датасету. С другой стороны, для данной задачи уж лучше часики повесить. Поток можно использовать, например, когда у тебя есть в БД картинки. Основной запрос выгребает записи. Далее, по ID записей дополнительный поток начинает подгружать нужные картинки и засовывать их в нужные контролы. Возможно, у контролов придется заблокировать канву, что бы не дергались раньше времени. |