Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оцените статью о потоках 
:(
    Опции темы
999bit
Дата 16.10.2007, 06:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 16.10.2007

Репутация: нет
Всего: нет



Все ошибки, недочёты и конешно ваше мнение

1. Предисловие
2. Создание многопоточности
3. Приостановка и разрушение
4. Конструктор, деструктор, передача парметров в поток
5. Общая переменная, потокобезопасность
6. Синхронизация, 
7. Передача данных,параметров в VCL

1. Предисловие
Решил написать небольшую статейку о потоках в Delphi так как их понимание довалась мне не легко, хоть в просторах инете можно найти кучу статей или документации о них, но они все мне показались 
слишком сложные для новичка  или статьи попроще но с многими недочётами каторые мне приходилось спрашивать на форумах или искать в 
других местах. В этой статейки будут собраны только те вапросы каторые мне показались более затруднительные для понимания, тоесть это статья для новичка каторый может
столкнуться с этими проблемами. Для лучшего понимания текста и кода в статье лучше использовать приложенный исходник.

2. Создание многопоточности

Жмём старт и "поехали" по коду, первое что это запускается цикл в катором находится процедура создающая потоки *StartTH*, цикл от 0 до 9 значит будет создано 10 потоков, "перепрыгиваем" к процедуре
StartTH, первая строчка собственно и создаёт поток, у неё один параметр False означающий что поток будет запушен сразу, при параметре True можно содать поток, и выполнить
нужные действия, а потом уже запустить командой Resume, в моёс случии *FM[ID].Resume* , ID присваивает каждому потоку свой номер что даёт возможность манипулировать отдельным потоком. 
Код

//cap
const 
 N =  9;

//type
FM:array[0..N] of TH;

//procedure
procedure TMainForm.StartTH;
 begin
  FM[ID]:= TH.Create(False);
  FM[ID].FreeOnTerminate:= True;
 end;
--------------------------------------------------------------
procedure TMainForm.btnStartClick(Sender: TObject);
var
A: integer;
begin
 For A:= 0 to N  do
  begin
   StartTH(ID);
   INC(ID); 
  end;
end;



3.Приостановка и разрушенние

Код

procedure TMainForm.btnSRTClick(Sender: TObject);
var
B: integer;
begin
 for B:= 0 to N do
  begin
   FM[B].Suspend;
  end;
end;


Resume - запуск
Suspend - приостановка
Terminate - разрушение

В зависимости от выбранной команды будет происходить запуск, приостановка или разрушение. Также можно этими командами можно пользоваться в самом потоке.

4. Конструктор, деструктор, передача парметров в поток

Конструктор может служить для многих задач, я пользовалься им как передачей значений переменных из главного в созданные потоки.
Код
 
*VCL*
procedure TMainForm.StartTH;
 begin
  FM[ID]:= TH.Create(False, ID);
 end;

[Thread]
//type
constructor Create(CreateSuspennded: Boolean; var IDThread: integer);
//procedure
constructor Th.Create(CreateSuspennded: Boolean;
            var IDThread: integer);
begin
  inherited Create(CreateSuspennded);
  ID:= IDThread;
end;


параметр ID находящийся как раз после False, это как раз тот параметр каторый передается конструктору, а тот уже в поток, этих параметров может быть сколь угодно вам. 
Что надо сделать это только прировнять переменную заданную в потоке с переменной передаваемой конструктором *ID:= IDThread*. После чего её можно использовать в потоке...
Деструктор это противоположность конструктору, создаём/разрушаем; вначале/вконце работы потока. Это аналогия создания и разрушения формы. *Create Form/ Destroy Form*

5. Общая переменная

Бывают случии када всем потоком требуется общая переменная,  задают её как обычную переменную за границами *type*, посморите в моих приклодных исходниках, она у меня num, 
каждый поток её увеличивает на еденицу, но тут мы сталкиваемся с потокобезопасностью, может случится что переменую *num* могут коснуться два или более потока одновременна, что приведет к
неизвестным последствиям, скорее всего просто программа зависнет. Чтобы такова неслучилось я использовал один из методов называемый критическиеми секциями. Cоздать её вы можете как в VCL так и в потоке
InitializeCriticalSection(CS) - инцилизация критической секции, создавать до начала работы потока, лучше в VCL до создания потока или конструкторе
DeleteCriticalSection(CS) - удалять по завершению потока можно, лучше в деструкторе
EnterCriticalSection(MainForm.CS) - блокировки небозапосного участка кода
LeaveCriticalSection(MainForm.CS) - разблокировка небозапосного участка кода

Код

procedure TH.Execute;
var
A: Integer;
 For A:= 1 to 9 do
  begin
   EnterCriticalSection(MainForm.CS);
   INC(Num);
   LeaveCriticalSection(MainForm.CS);
  end;



6.Синхронизация
Код

*VCL*
procedure Th.UpdateForm;
begin
 IF Sync = 1
 Then
 CurrentItem:= MainForm.TreeViewLog.Items.Add(nil,'Поток '+IntToStr(ID))
 Else
 MainForm.TreeViewLog.Items.AddChild(CurrentItem,IntToStr(Num))
end;
*Thread*
Synchronize(UpdateForm)


Синхронизация это тоже из части потокобезопасности, лучше патоку не знать что вообще есть VCL, так ему живется спокойней. В моём примере используется одна процедура 
для сихранизации двух строчек в коде каторые обращаются к VCL, просто заменяю обращение к VCL на вызов процедуры Synchronize, в каторой уже происходит обращение к VCL. 
Бывает такие случии када нужно синхронизировать чекбоксы, радиобутоны и тд, значения каторых нужно знать потоку, для их синхранизации я использую конструктор 
Например
Код
 
*VCL*
procedure SyncForm;
var
Check: boolean
begin
IF RadioButtonForm.Checked 
Then Check:= True
Else Check:= False
----------------------------------
procedure TMainForm.btnStartClick(Sender: TObject);
begin
StartTH(MainID, Check)


После работаем с *Check* также как с *MainID* 


7. Передача данных, параметров VCL

Бывают случии, что из потока надо передать некоторые результаты работы потока. Для передачи данных VCL отправляем сообщение хендлу VCL таким образом 
*PostMessage(MainForm.Handle, WM_DATA_IN_BUF, 0, 0)*
где 
MainForm.Handle - хендл нашей формы
WM_DATA_IN_BUF - иидивидуальное значение, у меня оно
*const
   WM_DATA_IN_BUF = WM_APP + 1000*

Получив это сообщение процедура находящиеся в VCL обработает полученные данные
Код

[Thread]
MainForm.Str:= 'End work...';
PostMessage(MainForm.Handle, WM_DATA_IN_BUF, 0, 0);

[VCL]
//type
procedure HandleNewData(var Message: TMessage); message WM_DATA_IN_BUF;

//procedure
procedure TMainForm.HandleNewData(var Message: TMessage);
begin
 LabelEndWork.Caption:= Str;
end;


Str - присваивается в потоке, ей может быть хоть массив, хоть стринг лист, созданные потоки заносят данные, а главный обрабатывает их

P.S. Для лучшего понимания потоков советую этот FAQ но не советую её новичкам...
Многопоточность 
Исходник


PM MAIL   Вверх
Alexeis
Дата 16.10.2007, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(999bit @  16.10.2007,  06:50 Найти цитируемый пост)
Terminate - разрушение

  Не совсем. Разрушение (уничтожение) это Free. Terminate - сигнал потоку о необходимости досрочного завершения.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
MetalFan
Дата 16.10.2007, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



автор, ты бы в ворд сначала текст загнал, ошибки грамматические поправил...
з.ы. по существу - позже


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
EvilsInterrupt
Дата 16.10.2007, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 3
Всего: 9



999bit, Может я еще и не проснулся, но поясните цель написания статьи про потоки? Неужели существующие статьи про эту тематику не удовлетворяют?
PM MAIL WWW ICQ Jabber   Вверх
DonPager
Дата 16.10.2007, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Колдырь
**


Профиль
Группа: Участник
Сообщений: 327
Регистрация: 28.3.2003
Где: Воронеж

Репутация: нет
Всего: 2



...незнаю незнаю ... после 10й грамматической АшиПки перестал читать... ну уж так я привык : если статья то всё должны соблюдаться некоторые правила ... и правила языка в том числе...
так что: не осилил...


--------------------
кодер + лодырь = колдырь
PM MAIL ICQ Skype GTalk   Вверх
MetalFan
Дата 16.10.2007, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



много недочетов. многие аспекты не освещены или показаны не совсем верно.
я бы так писать в своей программе не стал


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
999bit
Дата 16.10.2007, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 16.10.2007

Репутация: нет
Всего: нет



Цитата

 Не совсем. Разрушение (уничтожение) это Free. Terminate - сигнал потоку о необходимости досрочного завершения.

Учту
Цитата

автор, ты бы в ворд сначала текст загнал, ошибки грамматические поправил...
з.ы. по существу - позже

Мож у меня ворд неправильный какой... Я в нёи прогонял текст
Цитата

999bit, Может я еще и не проснулся, но поясните цель написания статьи про потоки? Неужели существующие статьи про эту тематику не удовлетворяют?

В простых для понимания статьях я не где ненаходил например про передачу параметров в поток и т.д. да и вообще возникло огромное желание что нибудь написать  

И хотелось бы побольше канкретики в том что щитаете неправильным  

Это сообщение отредактировал(а) 999bit - 16.10.2007, 16:07
PM MAIL   Вверх
ALeXandrK
Дата 16.10.2007, 15:33 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 342
Регистрация: 31.1.2007
Где: Санкт-Петербург

Репутация: 3
Всего: 6



Эталон на эту тему: Многопоточность - как это делается в Дельфи. Не используйте потоки, не прочитав это(Она у тебя в ссылках написана в конце,... а лучше б как эпиграф smile ), но мне кажется, что она и новичкам очень доступна. 

Лучше б ты статью назвал по типу "Мой опыт многопоточности" - это более верно охарактеризовывает её.

Удачи smile 

Это сообщение отредактировал(а) ALeXandrK - 16.10.2007, 15:41


--------------------
Богат не/ни тот, у кого много, а тот, кому хватает
PM WWW   Вверх
MetalFan
Дата 16.10.2007, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Цитата(999bit @  16.10.2007,  15:30 Найти цитируемый пост)
И хотелось бы побольше канкретики в том что кажется неправильным

бррр... русская языка в школе не учил, да?!
автор, пиши ГРАМОТНО и народ потянется. мне например совершенно нет желания давать советы по этой "зарисовке".
вот если б все было нормально с точки зрения русск.языка написано, то я бы высказал свое мнение.

так и быть, несколько замечаний: 
1. утверждение про terminate неверно, как уже ранее сказал Alexeis. реакция на terminate целиком на совести программиста.
2. нафиг в конструкторе ID передается как var параметр?
3. крит.секция. зачем с ней напрямую работать? есть удобный класс-обертка TCriticalSection. да и вообще использование ее в данном примере неоправдано. есть ряд Interlocked* функций для таких целей
4. 
Цитата(999bit @  16.10.2007,  06:50 Найти цитируемый пост)
IF RadioButtonForm.Checked 
Then Check:= True
Else Check:= False

о нет... все... после этого у меня только один вывод: автору САМОМУ сначала нужно научиться программировать, а уж потом учить других и тем более писать "статьи"...



--------------------
There are always someone smarter than you...
PM MAIL   Вверх
999bit
Дата 16.10.2007, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 16.10.2007

Репутация: нет
Всего: нет



Цитата

но мне кажется, что она и новичкам очень доступна

На чём основываешься, сам изучал потоки, используя эту статью? Или ты зная уже отлично потоки, рассматриваеш "Многопоточность - как это делается в Дельфи" очень доступной?

Цитата

2. нафиг в конструкторе ID передается как var параметр?

Всмысле? ID передается, как пример передачи значений переменных в поток
Цитата

3. крит.секция. зачем с ней напрямую работать? есть удобный класс-обертка TCriticalSection. да и вообще использование ее в данном примере неоправдано. есть ряд Interlocked* функций для таких целей

Критические секции легче понять
Цитата

о нет... все... после этого у меня только один вывод: автору САМОМУ сначала нужно научиться программировать, а уж потом учить других и тем более писать "статьи"...

Я не старался сделать лучше, я старался сделать легче и понятней



Это сообщение отредактировал(а) 999bit - 16.10.2007, 19:38
PM MAIL   Вверх
MetalFan
Дата 16.10.2007, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



"понятней" очень зависит от "правильней".
ибо если будет понятная ахинея - то пользы от нее 0


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Alexeis
Дата 16.10.2007, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(999bit @  16.10.2007,  16:32 Найти цитируемый пост)
"Многопоточность - как это делается в Дельфи" очень доступной

  На самом деле зная общую теорию многопоточности и совершенно не зная ее реализации в Delphi, я почти все понял с первого раза. Нужно внимательно читать и терпеливо втыкать. Для тех кому уж очень не терпится все пощупать Петрович написал свой пример грамотной реализации потоков. Думаю следует начать с него если с книгой пока что никак http://forum.vingrad.ru/index.php?show_typ...howtopic=163841


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1012 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.