 |
18.02.2012, 22:13
|
#1
|
|
|
|
Сержант
|
 Регистрация: 03.04.2011
 Сообщений: 128
 Популярность: 5379
 Сказал(а) спасибо: 137
Поблагодарили 209 раз(а) в 111 сообщениях
|
Создание Потоков
Может кому то будет полезна эта статья .
Создать дополнительный поток в Delphi поможет объект TThread. Ввести объект TThread в программу можно двумя способами:
1.С помощью Мастера;
2.Вручную.
И так способ первый:
Заходим в:
 |
Цитата: |
 |
|
|
|
|
|
|
|
File -> New -> Other... |
|
 |
|
 |
|
В появившейся табличке выбора найдём TThread Object. Появится окошко, в верхнюю строку которого (Class Name) введём имя нашего будущего потока: MyThread. В результате будет создан модуль, содержащий заготовку кода, реализующего дополнительный поток Delphi:
 |
Цитата: |
 |
|
|
|
|
|
|
|
unit Unit2; // Имя модуля, содержащего поток. При сохранении его можно изменить.
interface
uses
Classes;
type
MyThread = class(TThread) //MyThread - заданное нами имя потока.
private
{ Private declarations }
protected
procedure Execute; override;
end;
implementation
{ Important: Methods and properties of objects in visual components can only be
used in a method called using Synchronize, for example,
Synchronize(UpdateCaption);
and UpdateCaption could look like,
procedure MyThread.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }
{ MyThread }
procedure MyThread.Execute;
begin
{ Place thread code here }
end;
end. |
|
 |
|
 |
|
А вот и второй способ(на мой взгляд более распростроненый):
И так начнем сначала мы будем описывать класс нашего потока:
 |
Цитата: |
 |
|
|
|
|
|
|
|
TMyThread = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end; |
|
 |
|
 |
|
Затем нужно ввести в глобальную переменную,переменную нашего потока:
 |
Цитата: |
 |
|
|
|
|
|
|
|
var
Form1: TForm1;
MyThread: TMyThread; |
|
 |
|
 |
|
И наконец создаем процедуру execute уже выше нами описаную:
 |
Цитата: |
 |
|
|
|
|
|
|
|
procedure TMyThread.Execute;
begin
.....КОД.....
end; |
|
 |
|
 |
|
Ну а дальше наверно уже все догадываетесь что поток нужно запустить а через какую процедуру это уже ваша фантазия,ну а я для примера сделаю это простым нажатием кнопочки,ах да в примере коментами я опишу что да как:
 |
Цитата: |
 |
|
|
|
|
|
|
|
procedure TForm1.Button1Click(Sender: TObject);
begin
//Создаем экземпляр потока:
MyThread:=TMyThread.Create(False);
//Параметр False запускает поток сразу после создания, True - запуск впоследствии , методом Resume
//Указываем параметры потока, например приоритет:
MyThread.Priority:=tpNormal;
//Можно указать что после завершения кода поток завершится автоматически:
MyThread.FreeOnTerminate:=true;
end; |
|
 |
|
 |
|
Как вы уже заметили что в примере описан приоритет tpNormal так вот я готов поспорить что не у всех сильные машины и именно для этого я и составил небольшую табличку параметров приоритета нашего потока смотрите ниже:
 |
Цитата: |
 |
|
|
|
|
|
|
|
tpIdle Низший приоритет. Поток получает время только тогда, когда операционная система находится в состоянии простоя.
tpLowest Приоритет на два пункта ниже нормального
tpLower Приоритет на один пункт ниже нормального
tpNormal Нормальный приоритет
tpHigher Приоритет на один пункт выше нормального
tpHighest Приоритет на два пункта выше нормального
tpTimeCritical Максимальный приоритет. Приоритет на уровне функций ядра операционной системы. |
|
 |
|
 |
|
Может кому пригодится эта статейка,а кто это знает просьба тапками не кидать!
Я писал её сам и будет очень обидно если мне за минусуют репу.
А по теме вскоре дополню эту тему и научу вас синхролизировать наши потоки между собой.
________________
DO: Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). ; Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). ; Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). ; Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). ;
WF: Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). ; Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). ; Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Последний раз редактировалось gum_classis; 29.02.2012 в 13:06.
|
|
|
19.02.2012, 00:11
|
#2
|
|
|
|
Лейтенант-командор
|
 Регистрация: 12.08.2010
 Сообщений: 727
 Популярность: 30569
 Золото Zhyk.Ru: 1
 Сказал(а) спасибо: 57
Поблагодарили 645 раз(а) в 386 сообщениях
|
Re: Создание Потоков
________________
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.
Perfect World: PWDatabaseScanner, Client, PWNickRenamer, PWClientRenamer, База логинов PW, Гайд по варУ, Зарабатываем репутацию.
Delphi: Авторизация на сайте с помощью Indy, Загрузка изображений с интернета в TImage с помощью Indy, Автоматическая смена стандартной версии Indy в Delphi на Indy 10.0.76 / 10.1.5, Основы парсинга с помощью Indy, Делаем Updater до программы с помощью Indy.
Other: ShowIP, FFUUU смайлы в QIP, Как играть в Minecraft (видеокурс), Как мы захватили человечество :D, Энергия в Лицемер/TopFace, PasGen.
|
|
|
19.02.2012, 00:40
|
#3
|
|
|
|
Сержант
|
 Регистрация: 03.04.2011
 Сообщений: 128
 Популярность: 5379
 Сказал(а) спасибо: 137
Поблагодарили 209 раз(а) в 111 сообщениях
|
Re: Создание Потоков
________________
DO: Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). ; Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). ; Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). ; Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). ;
WF: Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). ; Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). ; Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
|
|
|
19.02.2012, 10:46
|
#4
|
|
|
|
Рыцарь-защитник
|
 Регистрация: 14.06.2010
 Сообщений: 584
 Популярность: 6626
 Сказал(а) спасибо: 86
Поблагодарили 847 раз(а) в 266 сообщениях
|
Re: Создание Потоков
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
Наоборот!,сначала настроить всё а потом уже запускать!
|
|
 |
|
 |
|
в своем коде ты сначала запустил поток, а потом изменил его приоритет, так делать нельзя, если надо настраивать поток, то сначала настройка, потом уже только запуск.
так же одно замечание, TThread это НЕ ОБЪЕКТ, а класс!!! обьектом в мастере он обозван тк создается новый юнит с шаблоном кода. так же замечание, раз уж рассказал про поток, надо было предусмотреть, что желающие писать доп поток обязательно захотят сделать какой либо вывод на форму или другой компонент в программе => надо описать вариант синхронизации и критической секции, так же пояснить, к каким последствиям может привести попытка передачи данных из потока в другой поток (форма тоже отдельный поток!) без синхронизации или критической секции. а такая передача может пройти гладко, а может превратить память отданую под прогу в месево непонятных кусокв бог знает чего.
________________
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Последний раз редактировалось Mebius; 07.03.2012 в 23:07.
|
|
|
19.02.2012, 15:43
|
#5
|
|
|
|
Лейтенант-командор
|
 Регистрация: 12.08.2010
 Сообщений: 727
 Популярность: 30569
 Золото Zhyk.Ru: 1
 Сказал(а) спасибо: 57
Поблагодарили 645 раз(а) в 386 сообщениях
|
Re: Создание Потоков
________________
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.
Perfect World: PWDatabaseScanner, Client, PWNickRenamer, PWClientRenamer, База логинов PW, Гайд по варУ, Зарабатываем репутацию.
Delphi: Авторизация на сайте с помощью Indy, Загрузка изображений с интернета в TImage с помощью Indy, Автоматическая смена стандартной версии Indy в Delphi на Indy 10.0.76 / 10.1.5, Основы парсинга с помощью Indy, Делаем Updater до программы с помощью Indy.
Other: ShowIP, FFUUU смайлы в QIP, Как играть в Minecraft (видеокурс), Как мы захватили человечество :D, Энергия в Лицемер/TopFace, PasGen.
|
|
|
22.02.2012, 11:21
|
#6
|
|
|
|
Сержант
|
 Регистрация: 20.07.2010
 Сообщений: 138
 Популярность: 26409
 Сказал(а) спасибо: 52
Поблагодарили 567 раз(а) в 198 сообщениях
|
Re: Создание Потоков
Товарищи, ну надо же хотяб Ctrl-Click по классу потока и посмотреть, что там внутри происходит то.
А именно там есть такой вот конструктор:
Код:
constructor Create(CreateSuspended: Boolean); overload;
Где параметр CreateSuspended отвечает за запуск потока сразу после создания или просто выделение памяти.
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
MyThread:=TMyThread.Create(False);
MyThread.Priority:=tpNormal;
MyThread.FreeOnTerminate:=true;
end;
Превращается в:
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
MyThread:=TMyThread.Create(True);
MyThread.Priority:=tpNormal;
MyThread.FreeOnTerminate:=true;
MyThread.Resume;
end;
P.S как вы собрались чего-то настраивать в объекте, когда он еще даже не создан?
________________
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
|
|
|
22.05.2012, 15:05
|
#7
|
|
|
|
Разведчик
|
 Регистрация: 30.09.2010
 Сообщений: 4
 Популярность: 10
 Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: Создание Потоков
Ребят не могу остановить поток.
в глобал вар написал:
pause: TNewThread; // TNewThread мой поток
Потом кидаю кнопку которая остановит поток и пишу в ней:
pause.Terminate;
Запускаю, сначало жму старт, запускаю поток , потом жму паузу и вылетает ошибка, а поток дальше работает ._.
создавать булевую переменную , на форму труе, в кнопке фалсе тоже пробовал, но поток не останавливается ._.
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 12:30.
|
 |