| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Оцените статью о потоках |
| Автор: 999bit 16.10.2007, 06:50 | ||||||||||||||
| Все ошибки, недочёты и конешно ваше мнение 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 но не советую её новичкам... http://forum.vingrad.ru/forum/topic-60076/0.html http://upload.com.ua/get/899999273 |
| Автор: Alexeis 16.10.2007, 09:54 |
Не совсем. Разрушение (уничтожение) это Free. Terminate - сигнал потоку о необходимости досрочного завершения. |
| Автор: MetalFan 16.10.2007, 10:06 |
| автор, ты бы в ворд сначала текст загнал, ошибки грамматические поправил... з.ы. по существу - позже |
| Автор: EvilsInterrupt 16.10.2007, 10:19 |
| 999bit, Может я еще и не проснулся, но поясните цель написания статьи про потоки? Неужели существующие статьи про эту тематику не удовлетворяют? |
| Автор: DonPager 16.10.2007, 12:28 |
| ...незнаю незнаю ... после 10й грамматической АшиПки перестал читать... ну уж так я привык : если статья то всё должны соблюдаться некоторые правила ... и правила языка в том числе... так что: не осилил... |
| Автор: MetalFan 16.10.2007, 14:47 |
| много недочетов. многие аспекты не освещены или показаны не совсем верно. я бы так писать в своей программе не стал |
| Автор: 999bit 16.10.2007, 15:30 | ||||||
Учту
Мож у меня ворд неправильный какой... Я в нёи прогонял текст
В простых для понимания статьях я не где ненаходил например про передачу параметров в поток и т.д. да и вообще возникло огромное желание что нибудь написать И хотелось бы побольше канкретики в том что щитаете неправильным |
| Автор: ALeXandrK 16.10.2007, 15:33 |
| Эталон на эту тему: http://forum.vingrad.ru/topic-60076.html(Она у тебя в ссылках написана в конце,... а лучше б как эпиграф Лучше б ты статью назвал по типу "Мой опыт многопоточности" - это более верно охарактеризовывает её. Удачи |
| Автор: MetalFan 16.10.2007, 16:02 |
бррр... русская языка в школе не учил, да?! автор, пиши ГРАМОТНО и народ потянется. мне например совершенно нет желания давать советы по этой "зарисовке". вот если б все было нормально с точки зрения русск.языка написано, то я бы высказал свое мнение. так и быть, несколько замечаний: 1. утверждение про terminate неверно, как уже ранее сказал Alexeis. реакция на terminate целиком на совести программиста. 2. нафиг в конструкторе ID передается как var параметр? 3. крит.секция. зачем с ней напрямую работать? есть удобный класс-обертка TCriticalSection. да и вообще использование ее в данном примере неоправдано. есть ряд Interlocked* функций для таких целей 4. о нет... все... после этого у меня только один вывод: автору САМОМУ сначала нужно научиться программировать, а уж потом учить других и тем более писать "статьи"... |
| Автор: 999bit 16.10.2007, 16:32 | ||||||||
На чём основываешься, сам изучал потоки, используя эту статью? Или ты зная уже отлично потоки, рассматриваеш "Многопоточность - как это делается в Дельфи" очень доступной?
Всмысле? ID передается, как пример передачи значений переменных в поток
Критические секции легче понять
Я не старался сделать лучше, я старался сделать легче и понятней |
| Автор: MetalFan 16.10.2007, 16:37 |
| "понятней" очень зависит от "правильней". ибо если будет понятная ахинея - то пользы от нее 0 |
| Автор: Alexeis 16.10.2007, 16:40 |
На самом деле зная общую теорию многопоточности и совершенно не зная ее реализации в Delphi, я почти все понял с первого раза. Нужно внимательно читать и терпеливо втыкать. Для тех кому уж очень не терпится все пощупать Петрович написал свой пример грамотной реализации потоков. Думаю следует начать с него если с книгой пока что никак http://forum.vingrad.ru/index.php?show_type=forum&showtopic=163841 |