Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.12.26;
Скачать: CL | DM;

Вниз

Потоки, потоки, потоки...   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.022 c
7-86581
LAMA3OID
2003-10-15 15:34
2003.12.26
Быстрая запись на винт


4-86602
Dave
2003-10-31 11:21
2003.12.26
Как отследить блокировку PC и logout в WinXP?


14-86510
Knight
2003-12-01 00:22
2003.12.26
Что сон для человека?


3-86281
BlackCat
2003-12-02 19:01
2003.12.26
Несоответствие типов данных в выражении условия отбора.


14-86488
alexsys
2003-12-04 20:05
2003.12.26
Собаководство