Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос по TThread [D7, XP]


HairBack ©   (2008-09-25 15:42:00) 

Столкнулся с необходимостью использования потока для формирования отчета. Вот пример моего кода, подскажите пожалуйста, правильно ли я написал код, если где не верно подправьте пожалуйста.

type
 TMyThread = class(TThread)
 protected
   procedure Execute; override;
 end;

var
 Form1: TForm1;
 Hread : TMyThread;
implementation

procedure TMyThread.Execute;
var
 i  : integer;
 SL : TStringList;
begin
SL := TStringList.Create;
While not Form1.Table1.Eof do
begin
  SL.Add(Form1.Table1.FieldByName('Name').AsString);
  Form1.Table1.Next;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Hread:=TMyThread.Create(true);
Hread.Resume;
end;


Сергей М.   (2008-09-25 17:21:00) [1]


> HairBack   (25.09.08 16:12) [8]
>
>


Есть подозрение, что тормоза у тебя не в формировании отчета как таковом, а в навигации по НД.


KSergey   (2008-09-25 17:10:00) [2]

> HairBack   (25.09.08 16:55) [15]
> Я конечно начинающий но не настолько глуп, и не нужно предполагать
> что функциональность моей программы ограничивается лишь
> добавлением, удалением и формированием отчета.

Так она еще и не ограничивается этим?!
Беда в том что она это позволяет делать, вернее - засада. Вот о чем сказано.


Сергей М.   (2008-09-25 17:05:00) [3]


> HairBack   (25.09.08 16:55) [15]


> не нужно предполагать что функциональность моей программы
> ограничивается лишь добавлением, удалением и формированием
> отчета


Вот именно - мало ли что ты еше разрешишь юзеру в этот момент делать с НД и со всеми теми объектами, от которых зависит актуальность и корректность этого НД : коннекция, сессия, транзакция и иже с ними ..

В [12] показаны только грабельки, но впереди еще ждут грабли и граблища (от AV до краха процесса), если не вникнуть в вышесказанное тебе


Palladin   (2008-09-25 16:58:00) [4]

эт не грубо, эт реальность... при беглом взгляде на приведенное - сразу видно, ни одной статьи не прочитанно ни про многопоточность ни про работы с различными библиотеками доступа к БД


oldman   (2008-09-25 16:58:00) [5]


> procedure TMyThread.Execute;
> var
>  i  : integer;
>  SL : TStringList;
> begin
> SL := TStringList.Create;
> While not Form1.Table1.Eof do
> begin
>   SL.Add(Form1.Table1.FieldByName('Name').AsString);
>   Form1.Table1.Next;
> end;
> end;


Сколько секунд выполняется данный код? Почему возникла необходимость выносить его в отдельный поток?


HairBack   (2008-09-25 16:55:00) [6]

Всем спасибо за наставление.


> Сергей М. ©   (25.09.08 16:41) [12]


Я конечно начинающий но не настолько глуп, и не нужно предполагать что функциональность моей программы ограничивается лишь добавлением, удалением и формированием отчета.


> деревом по дереву не больно :))


Грубо


MsGuns   (2008-09-25 16:49:00) [7]

1. При отсутствии навыков работы с потоками (а это очевидно) следует создавать потоковый класс с помощью самой дельфы как отдельный юнит (через меню New)
2. При реализации потока руководствоваться примерами, имеющимися в Делфи. В частности, моменты создания и уничтожения потока
3. Если алгоритм, "завернутый" в поток, должен обращаться к внешним данным (БД), надо все объекты доступа, используемые в потоке, либо создавать непосредственно в нем, либо передавать, однако во втором случае необходимое условие - не "трогать" эти объекты в основном потоке. Из "базовых" объектов к таким можно отнести (с известными оговорками) только TDataBase или TADOConnection (или им подобные). Все "датасеты" поток должен уметь получать самостоятельно. То же самое относится и к "разделяемым" ресурсам (например, принтеру, экрану, файлу и т.д.) - либо использовать гарантированно свои либо юзать их в режиме синхронизации с основным потоком.

Вообще, ИМХО, применять потоки нужно лишь после того, как более-менее разберешься в принципе их работы, точнее, в механизме распределения ресурсов ОС между основным потоком и вторичными.

Отчеты же, не ИМХО, лучше проектировать отдельными специализированными приложениями, в которых нет непосрредственной работы с данными (добавление, правка, сервис отображения). Такое приложение при желании можно вызвать из меню "основной" программы и оно будет выполняться самостоятельно, не мешая пользователю (насколько это позволяет ОС и ПК)


Palladin   (2008-09-25 16:42:00) [8]

деревом по дереву не больно :))


Сергей М.   (2008-09-25 16:41:00) [9]


> HairBack   (25.09.08 16:12) [8]
>
>
> > Хотелось бы всетаки увидеть ответ на [1]...
>
>
> Нужно что бы при формировании отчета, пользователь мог работать
> дальше а не дожидаться


Продолжаю твою мысль - например, удалять записи из набора данных, созданного объектом Table1.

А теперь думай головой: доп.поток идет неспеша по набору данных, формируя тот самый отчет, доходит до некоей N-ной записи в нем, которую юзер взял да удалил, благо ничто не мешает ему это сделать - ты развязал юзеру руки.

Как тебе такие грабли ? Не больно будет наступить на них ?)


Ega23   (2008-09-25 16:23:00) [10]


> в [5] читай Form1.Table1 следует заменить на объект принадлежащий
> данныму потоку.


Это совершенно не обязательно.

А в общем случае - [10].


Поросенок Винни-Пух   (2008-09-25 16:22:00) [11]

в [5] читай Form1.Table1 следует заменить на объект принадлежащий данныму потоку.

Полумера. Сессия должна быть своя отдельная.


anonims   (2008-09-25 16:18:00) [12]

в [5] читай Form1.Table1следует заменить на объект принадлежащий данныму потоку.


HairBack   (2008-09-25 16:12:00) [13]


> Хотелось бы всетаки увидеть ответ на [1]...


Нужно что бы при формировании отчета, пользователь мог работать дальше а не дожидаться завершения формирования отчета.


Ega23   (2008-09-25 16:11:00) [14]


> Исправьте пожалуйста, очень прошу =(


1. Сам поток тут бессмысленен. Он имеет смысл, пожалуй, только на реально огромных наборах данных. Как такой набор данных получить на клиенте, это нетривиальная задачка.

2. Про контексты Сергей М уже сказал.

3. Не вижу убийства SL

4. Также не вижу, нафига он вообще нужен.

5. Самая фишка - на каждую итерацию потока у тебя новый создаётся (а все старые не убиваются).

6. Стиль оформления, мнемоника и т.п. - полный отстой.

Резюме - переделать всё.


Dennis I. Komarov   (2008-09-25 16:06:00) [15]

Хотелось бы всетаки увидеть ответ на [1]...


Сергей М.   (2008-09-25 16:00:00) [16]


> где не верно подправьте


Ключевая "неверность" - в контексте дополнительного потока крайне рисковано (а во многих случаях и недопустимо) обращаться к наборам данных, открытым в контексте другого потока (основного или дополнительного - неважно).


Palladin   (2008-09-25 16:00:00) [17]

это - не исправить


HairBack   (2008-09-25 15:59:00) [18]

Исправьте пожалуйста, очень прошу =(


Поросенок Винни-Пух   (2008-09-25 15:54:00) [19]

в чем сакральный смысл такого потока?


Ega23   (2008-09-25 15:54:00) [20]


> правильно ли я написал код,


Не правильно.


> где не верно подправьте пожалуйста.


Да в каждой строчке, практически.


Наверх

Титульная страница Поиск, карта сайта Написать письмо