Форум: "Начинающим";
Текущий архив: 2008.11.02;
Скачать: [xml.tar.bz2];
ВнизВопрос по TThread Найти похожие ветки
← →
HairBack (2008-09-25 15:42) [0]Столкнулся с необходимостью использования потока для формирования отчета. Вот пример моего кода, подскажите пожалуйста, правильно ли я написал код, если где не верно подправьте пожалуйста.
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 15:54) [1]в чем сакральный смысл такого потока?
← →
Ega23 © (2008-09-25 15:54) [2]
> правильно ли я написал код,
Не правильно.
> где не верно подправьте пожалуйста.
Да в каждой строчке, практически.
← →
HairBack (2008-09-25 15:59) [3]Исправьте пожалуйста, очень прошу =(
← →
Palladin © (2008-09-25 16:00) [4]это - не исправить
← →
Сергей М. © (2008-09-25 16:00) [5]
> где не верно подправьте
Ключевая "неверность" - в контексте дополнительного потока крайне рисковано (а во многих случаях и недопустимо) обращаться к наборам данных, открытым в контексте другого потока (основного или дополнительного - неважно).
← →
Dennis I. Komarov © (2008-09-25 16:06) [6]Хотелось бы всетаки увидеть ответ на [1]...
← →
Ega23 © (2008-09-25 16:11) [7]
> Исправьте пожалуйста, очень прошу =(
1. Сам поток тут бессмысленен. Он имеет смысл, пожалуй, только на реально огромных наборах данных. Как такой набор данных получить на клиенте, это нетривиальная задачка.
2. Про контексты Сергей М уже сказал.
3. Не вижу убийства SL
4. Также не вижу, нафига он вообще нужен.
5. Самая фишка - на каждую итерацию потока у тебя новый создаётся (а все старые не убиваются).
6. Стиль оформления, мнемоника и т.п. - полный отстой.
Резюме - переделать всё.
← →
HairBack (2008-09-25 16:12) [8]
> Хотелось бы всетаки увидеть ответ на [1]...
Нужно что бы при формировании отчета, пользователь мог работать дальше а не дожидаться завершения формирования отчета.
← →
anonims (2008-09-25 16:18) [9]в [5] читай Form1.Table1 следует заменить на объект принадлежащий данныму потоку.
← →
Поросенок Винни-Пух © (2008-09-25 16:22) [10]в [5] читай Form1.Table1 следует заменить на объект принадлежащий данныму потоку.
Полумера. Сессия должна быть своя отдельная.
← →
Ega23 © (2008-09-25 16:23) [11]
> в [5] читай Form1.Table1 следует заменить на объект принадлежащий
> данныму потоку.
Это совершенно не обязательно.
А в общем случае - [10].
← →
Сергей М. © (2008-09-25 16:41) [12]
> HairBack (25.09.08 16:12) [8]
>
>
> > Хотелось бы всетаки увидеть ответ на [1]...
>
>
> Нужно что бы при формировании отчета, пользователь мог работать
> дальше а не дожидаться
Продолжаю твою мысль - например, удалять записи из набора данных, созданного объектом Table1.
А теперь думай головой: доп.поток идет неспеша по набору данных, формируя тот самый отчет, доходит до некоей N-ной записи в нем, которую юзер взял да удалил, благо ничто не мешает ему это сделать - ты развязал юзеру руки.
Как тебе такие грабли ? Не больно будет наступить на них ?)
← →
Palladin © (2008-09-25 16:42) [13]деревом по дереву не больно :))
← →
MsGuns © (2008-09-25 16:49) [14]1. При отсутствии навыков работы с потоками (а это очевидно) следует создавать потоковый класс с помощью самой дельфы как отдельный юнит (через меню New)
2. При реализации потока руководствоваться примерами, имеющимися в Делфи. В частности, моменты создания и уничтожения потока
3. Если алгоритм, "завернутый" в поток, должен обращаться к внешним данным (БД), надо все объекты доступа, используемые в потоке, либо создавать непосредственно в нем, либо передавать, однако во втором случае необходимое условие - не "трогать" эти объекты в основном потоке. Из "базовых" объектов к таким можно отнести (с известными оговорками) только TDataBase или TADOConnection (или им подобные). Все "датасеты" поток должен уметь получать самостоятельно. То же самое относится и к "разделяемым" ресурсам (например, принтеру, экрану, файлу и т.д.) - либо использовать гарантированно свои либо юзать их в режиме синхронизации с основным потоком.
Вообще, ИМХО, применять потоки нужно лишь после того, как более-менее разберешься в принципе их работы, точнее, в механизме распределения ресурсов ОС между основным потоком и вторичными.
Отчеты же, не ИМХО, лучше проектировать отдельными специализированными приложениями, в которых нет непосрредственной работы с данными (добавление, правка, сервис отображения). Такое приложение при желании можно вызвать из меню "основной" программы и оно будет выполняться самостоятельно, не мешая пользователю (насколько это позволяет ОС и ПК)
← →
HairBack (2008-09-25 16:55) [15]Всем спасибо за наставление.
> Сергей М. © (25.09.08 16:41) [12]
Я конечно начинающий но не настолько глуп, и не нужно предполагать что функциональность моей программы ограничивается лишь добавлением, удалением и формированием отчета.
> деревом по дереву не больно :))
Грубо
← →
oldman © (2008-09-25 16:58) [16]
> 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;
Сколько секунд выполняется данный код? Почему возникла необходимость выносить его в отдельный поток?
← →
Palladin © (2008-09-25 16:58) [17]эт не грубо, эт реальность... при беглом взгляде на приведенное - сразу видно, ни одной статьи не прочитанно ни про многопоточность ни про работы с различными библиотеками доступа к БД
← →
Сергей М. © (2008-09-25 17:05) [18]
> HairBack (25.09.08 16:55) [15]
> не нужно предполагать что функциональность моей программы
> ограничивается лишь добавлением, удалением и формированием
> отчета
Вот именно - мало ли что ты еше разрешишь юзеру в этот момент делать с НД и со всеми теми объектами, от которых зависит актуальность и корректность этого НД : коннекция, сессия, транзакция и иже с ними ..
В [12] показаны только грабельки, но впереди еще ждут грабли и граблища (от AV до краха процесса), если не вникнуть в вышесказанное тебе
← →
KSergey © (2008-09-25 17:10) [19]> HairBack (25.09.08 16:55) [15]
> Я конечно начинающий но не настолько глуп, и не нужно предполагать
> что функциональность моей программы ограничивается лишь
> добавлением, удалением и формированием отчета.
Так она еще и не ограничивается этим?!
Беда в том что она это позволяет делать, вернее - засада. Вот о чем сказано.
← →
Сергей М. © (2008-09-25 17:21) [20]
> HairBack (25.09.08 16:12) [8]
>
>
Есть подозрение, что тормоза у тебя не в формировании отчета как таковом, а в навигации по НД.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.11.02;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.008 c