![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
999bit |
|
||||||||||||||
![]() Новичок Профиль Группа: Участник Сообщений: 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 присваивает каждому потоку свой номер что даёт возможность манипулировать отдельным потоком.
3.Приостановка и разрушенние
Resume - запуск Suspend - приостановка Terminate - разрушение В зависимости от выбранной команды будет происходить запуск, приостановка или разрушение. Также можно этими командами можно пользоваться в самом потоке. 4. Конструктор, деструктор, передача парметров в поток Конструктор может служить для многих задач, я пользовалься им как передачей значений переменных из главного в созданные потоки.
параметр 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) - разблокировка небозапосного участка кода
6.Синхронизация
Синхронизация это тоже из части потокобезопасности, лучше патоку не знать что вообще есть VCL, так ему живется спокойней. В моём примере используется одна процедура для сихранизации двух строчек в коде каторые обращаются к VCL, просто заменяю обращение к VCL на вызов процедуры Synchronize, в каторой уже происходит обращение к VCL. Бывает такие случии када нужно синхронизировать чекбоксы, радиобутоны и тд, значения каторых нужно знать потоку, для их синхранизации я использую конструктор Например
После работаем с *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 обработает полученные данные
Str - присваивается в потоке, ей может быть хоть массив, хоть стринг лист, созданные потоки заносят данные, а главный обрабатывает их P.S. Для лучшего понимания потоков советую этот FAQ но не советую её новичкам... Многопоточность Исходник |
||||||||||||||
|
|||||||||||||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Не совсем. Разрушение (уничтожение) это Free. Terminate - сигнал потоку о необходимости досрочного завершения. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
автор, ты бы в ворд сначала текст загнал, ошибки грамматические поправил...
з.ы. по существу - позже -------------------- There are always someone smarter than you... |
|||
|
||||
EvilsInterrupt |
|
|||
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 3 Всего: 9 |
999bit, Может я еще и не проснулся, но поясните цель написания статьи про потоки? Неужели существующие статьи про эту тематику не удовлетворяют?
|
|||
|
||||
DonPager |
|
|||
![]() Колдырь ![]() ![]() Профиль Группа: Участник Сообщений: 327 Регистрация: 28.3.2003 Где: Воронеж Репутация: нет Всего: 2 |
...незнаю незнаю ... после 10й грамматической АшиПки перестал читать... ну уж так я привык : если статья то всё должны соблюдаться некоторые правила ... и правила языка в том числе...
так что: не осилил... -------------------- кодер + лодырь = колдырь |
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
много недочетов. многие аспекты не освещены или показаны не совсем верно.
я бы так писать в своей программе не стал -------------------- There are always someone smarter than you... |
|||
|
||||
999bit |
|
||||||
![]() Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 16.10.2007 Репутация: нет Всего: нет |
Учту
Мож у меня ворд неправильный какой... Я в нёи прогонял текст
В простых для понимания статьях я не где ненаходил например про передачу параметров в поток и т.д. да и вообще возникло огромное желание что нибудь написать И хотелось бы побольше канкретики в том что щитаете неправильным Это сообщение отредактировал(а) 999bit - 16.10.2007, 16:07 |
||||||
|
|||||||
ALeXandrK |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 342 Регистрация: 31.1.2007 Где: Санкт-Петербург Репутация: 3 Всего: 6 |
Эталон на эту тему: Многопоточность - как это делается в Дельфи. Не используйте потоки, не прочитав это(Она у тебя в ссылках написана в конце,... а лучше б как эпиграф
![]() Лучше б ты статью назвал по типу "Мой опыт многопоточности" - это более верно охарактеризовывает её. Удачи ![]() Это сообщение отредактировал(а) ALeXandrK - 16.10.2007, 15:41 -------------------- Богат не/ни тот, у кого много, а тот, кому хватает |
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
бррр... русская языка в школе не учил, да?! автор, пиши ГРАМОТНО и народ потянется. мне например совершенно нет желания давать советы по этой "зарисовке". вот если б все было нормально с точки зрения русск.языка написано, то я бы высказал свое мнение. так и быть, несколько замечаний: 1. утверждение про terminate неверно, как уже ранее сказал Alexeis. реакция на terminate целиком на совести программиста. 2. нафиг в конструкторе ID передается как var параметр? 3. крит.секция. зачем с ней напрямую работать? есть удобный класс-обертка TCriticalSection. да и вообще использование ее в данном примере неоправдано. есть ряд Interlocked* функций для таких целей 4. о нет... все... после этого у меня только один вывод: автору САМОМУ сначала нужно научиться программировать, а уж потом учить других и тем более писать "статьи"... -------------------- There are always someone smarter than you... |
|||
|
||||
999bit |
|
||||||||
![]() Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 16.10.2007 Репутация: нет Всего: нет |
На чём основываешься, сам изучал потоки, используя эту статью? Или ты зная уже отлично потоки, рассматриваеш "Многопоточность - как это делается в Дельфи" очень доступной?
Всмысле? ID передается, как пример передачи значений переменных в поток
Критические секции легче понять
Я не старался сделать лучше, я старался сделать легче и понятней Это сообщение отредактировал(а) 999bit - 16.10.2007, 19:38 |
||||||||
|
|||||||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
"понятней" очень зависит от "правильней".
ибо если будет понятная ахинея - то пользы от нее 0 -------------------- There are always someone smarter than you... |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
На самом деле зная общую теорию многопоточности и совершенно не зная ее реализации в Delphi, я почти все понял с первого раза. Нужно внимательно читать и терпеливо втыкать. Для тех кому уж очень не терпится все пощупать Петрович написал свой пример грамотной реализации потоков. Думаю следует начать с него если с книгой пока что никак http://forum.vingrad.ru/index.php?show_typ...howtopic=163841 -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |