Форум: "Основная";
Текущий архив: 2003.12.26;
Скачать: [xml.tar.bz2];
ВнизПотоки, потоки, потоки... Найти похожие ветки
← →
real_dimedrol (2003-12-14 03:22) [0]Лажа какая-то с TThread.Terminate... Приходится постоянно в процедуре потока проверять if terminated... иначе он ложил (клал?) на метод и все равно пытается после его выполнения чего-то делать.
Кроме того, если сделать потоку Terminate когда он в состоянии Suspended, то происходит сплошной зависон... Как хотя бы реально понять, он Suspended или нет?
← →
Юрий Зотов (2003-12-14 06:22) [1]> Лажа какая-то с TThread.Terminate
Никакой лажи. Все работает именно так, как написано в документации. И непонятно, с чего это вдруг Вы решили, что должно быть как-то иначе.
Если надо прервать поток немедленно, используйте API-шную TerminateThread. Но не советую (разве что в критических случаях).
> Как хотя бы реально понять, он Suspended или нет?
Вы только не удивляйтесь, но вот прям так и понять:
if Suspended then ...
← →
real_dimedrol (2003-12-14 16:54) [2]Юрий Зотов ©
Ну вот с Terminate конечно все грустно. Поскоку читавши Ксавье-Пачеко (как, видимо, и вы) решил, что TerminateThread не подходит мне ни разу.
А вот насчет Suspended, это уже совсем не понятно, куда смотрели мои глаза... Работа, блин, с катушек сводит...
← →
Юрий Зотов (2003-12-14 17:05) [3]Посмотрите BeginThread и EndThread. Может очень выручить.
← →
Vuk (2003-12-14 17:24) [4]Я вообще Suspend не пользуюсь. Когда мне нужно заставить поток приостановить работу, я обычно заставляю его ждать какого-либо внешнего события. Оно так надежнее получается.
← →
real_dimedrol (2003-12-15 00:55) [5]Юрий Зотов ©
Непосредственно вам вопрос.
Для доступа к компонентам VCL мы во вторичном потоке (опять же по Ксавье-Пачеко) создаем в потоке экземпляры объектов-предков и через них работаем. Т.е. если при многопоточном доступе к БД нужно воспользоваться какими-то DBExpress и XXXQuery, например, то мы создаем у потока поля-объекты вроде FDBExpress и FXXXQuery и потом через их методы\свойства работаем с теми самыми DBExpress и XXXQuery. Вопрос: что это нам дает?
← →
panov (2003-12-15 01:30) [6]>real_dimedrol (15.12.03 00:55) [5]
Это дает то же, что и в примере, идущем с Delphi - разделить несколько расчетов по разным потокам.
Например, выполнение запросов к БД одновременно, а не ждать, пока закончится выполнение первого запроса.
← →
real_dimedrol (2003-12-15 02:51) [7]panov ©
Совсем не в ту степь. Еще раз читай вопрос. Я спрашивал, почему мы используем в потоке поля-объекты, которым присваиваем нужные объекты, вместо того, чтобы просто напрямую обращатся к нужным объектам.
Пример
Mythread = class (TThread);
private
fquery:TQuery;
..........
constructor MyThread.Create;
begin
...
fquery:=SomeForm.Query1;
...
end;
И потом юзаем fquery, когда нам нужен тот самый SomeForm.Query1. Так почему мы именно так делаем, а не просто юзаем SomeForm.Query1?
← →
ЮЮ (2003-12-15 04:13) [8]после fquery:=SomeForm.Query1 и будем юзать тот самый SomeForm.Query1, а в коде и идентификатор короче на 9 символов, да и постояное использование SomeForm.Query1 - лишние накладные расходы.
А прямое использование SomeForm. в коде делает невозможным использовать его с другой формой. Лучше так:
constructor MyThread.Create(Query: TQuery; CreateSuspended: boolean = false);
begin
inherited Create(CreateSuspended);
...
fquery: = Query;
...
end;
а в SomeForm создавать так
thread := TMyTread.Create(Query1);
← →
Юрий Зотов (2003-12-15 08:02) [9]> ЮЮ © (15.12.03 04:13) [8]
Насчет 9 символов - это сильно!
:о)
> real_dimedrol (15.12.03 00:55) [5]
> создаем в потоке экземпляры объектов-предков
Стоп! Аккуратнее с теминологией! Никаких экземпляров мы НЕ создаем, а лишь вводим поля-ссылки.
> Вопрос: что это нам дает?
Инициализировать эти поля нужно не так, как Вы написали в [7] (такая инициализация и правда ничего не дает), а передавать их реальные значения "снаружи" (например, через параметры перегруженного конструктора). Это дает универсальность.
Например, если ввести поле типа TDataSet и инициализировать его ссылкой на внешний DataSet, то такой поток сможет выполнять любой запрос к любой БД - независимо от фактического класса DataSet"а, от его настроек и от его владельца. Значит, в своей программе мы сможем использовать его сколько угодно раз, а, кроме того, сможем использовать и в любой другой программе.
← →
panov (2003-12-15 12:08) [10]>real_dimedrol (15.12.03 02:51) [7]
В таком виде использовать потоки бессмысленно, так как в этом случае преимущества потока использованы не будут.
← →
Юрий Зотов (2003-12-15 12:56) [11]> panov © (15.12.03 12:08) [10]
Почему?
Query.Open можно исполнить и в потоке. Только нужно принять меры, чтобы при этом не обновлялись визуальные контролы.
← →
panov (2003-12-15 13:09) [12]>Юрий Зотов © (15.12.03 12:56) [11]
Как помнится, один экземпляр провайдера, предоставляющего доступ к БД(например, TDataBase), не может выполнять несколько запросов параллельно.
← →
Юрий Зотов (2003-12-15 13:23) [13]Выполнять запрос в потоке - это значит выполнять его параллельно с чем-то, но ведь не обязательно именно с другим запросом?
Впрочем, в БД я не силен, поэтому спорить не буду. Скажу только, что как раз сейчас участвую в проекте, где есть кусок с открытием DataSet"ов именно в потоке. Работает, и за 5-6 лет эксплуатации у многих пользователей глюков не отмечено.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.12.26;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.007 c