Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.006 c
1-86372
Release
2003-12-15 15:35
2003.12.26
Преборазование типов


14-86541
Ske4er
2003-12-03 06:27
2003.12.26
Выключение монитора


6-86478
Alex134
2003-10-28 00:12
2003.12.26
Как узнать, существует ли пользователь с именем name?


9-86241
MeF88
2003-05-31 08:05
2003.12.26
Вечный вопрос: мировые и оконные координаты OpenGl


14-86526
Pat
2003-12-03 17:33
2003.12.26
Метод наименьших квадратов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский