Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1222422249
СуперЧайник
2008-09-26 13:44
2008.11.02
Помогите


2-1222414992
Iris
2008-09-26 11:43
2008.11.02
Обработка ошибки


1-1202115800
Андрей Пл
2008-02-04 12:03
2008.11.02
Вопрос по Report вывод итоговой суммы!!!


2-1222075958
Dennis I. Komarov
2008-09-22 13:32
2008.11.02
AllUsers App..Data?


3-1208544699
Alexey
2008-04-18 22:51
2008.11.02
Таблицы в InterBase





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский