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

Вниз

Вопрос по 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.02 c
2-1222241412
Nick87
2008-09-24 11:30
2008.11.02
SQLзапрос


2-1222422919
АндрейК
2008-09-26 13:55
2008.11.02
Как снять выделение и перейти в конец строки в Edit1


2-1222266794
Js.
2008-09-24 18:33
2008.11.02
COM обработка ошибок


4-1199201118
MFN+
2008-01-01 18:25
2008.11.02
Как получить имя Mapped файла по его Handle


1-1202116582
Ega23
2008-02-04 12:16
2008.11.02
Динамическое создание объектов: правильно ли сделал?