![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по 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]
> правильно ли я написал код,
Не правильно.
> где не верно подправьте пожалуйста.
Да в каждой строчке, практически.