Регистрация Главная Сообщество
Сообщения за день Справка Регистрация
Навигация
Zhyk.org LIVE! Реклама на Zhyk.org Правила Форума Награды и достижения Доска "почета"

Ответ
 
Опции темы
Старый 18.02.2012, 21:13   #1
Читер-спонсор
 Сержант
Аватар для gum_classis
 
gum_classis в состоянии испепелить взглядомgum_classis в состоянии испепелить взглядомgum_classis в состоянии испепелить взглядомgum_classis в состоянии испепелить взглядомgum_classis в состоянии испепелить взглядомgum_classis в состоянии испепелить взглядомgum_classis в состоянии испепелить взглядомgum_classis в состоянии испепелить взглядомgum_classis в состоянии испепелить взглядомgum_classis в состоянии испепелить взглядомgum_classis в состоянии испепелить взглядом
Регистрация: 03.04.2011
Сообщений: 128
Популярность: 5379
Сказал(а) спасибо: 137
Поблагодарили 209 раз(а) в 111 сообщениях
Отправить сообщение для gum_classis с помощью ICQ Отправить сообщение для gum_classis с помощью Skype™
 
По умолчанию Создание Потоков

Может кому то будет полезна эта статья .

Создать дополнительный поток в 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 Максимальный приоритет. Приоритет на уровне функций ядра операционной системы.

Может кому пригодится эта статейка,а кто это знает просьба тапками не кидать!
Я писал её сам и будет очень обидно если мне за минусуют репу.
А по теме вскоре дополню эту тему и научу вас синхролизировать наши потоки между собой.

Последний раз редактировалось gum_classis; 29.02.2012 в 12:06.
  Ответить с цитированием
Старый 18.02.2012, 23:11   #2
Бандеровец
 Лейтенант-командор
Аватар для VeTaL_UA
 
VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(
Регистрация: 12.08.2010
Сообщений: 727
Популярность: 30569
Золото Zhyk.Ru: 1
Сказал(а) спасибо: 57
Поблагодарили 645 раз(а) в 386 сообщениях
Отправить сообщение для VeTaL_UA с помощью ICQ Отправить сообщение для VeTaL_UA с помощью Skype™
 
По умолчанию Re: Создание Потоков

Цитата:
Сообщение от gum_classisПосмотреть сообщение
procedure TForm1.Button1Click(Sender: TObject);
begin
MyThread:=TMyThread.Create(False);
MyThread.Priority:=tpNormal;
MyThread.FreeOnTerminate:=true;
end;

Запустить поток и потом начать изменять параметры?
________________
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов
Кошельки: 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.


  Ответить с цитированием
Старый 18.02.2012, 23:40   #3
Читер-спонсор
 Сержант
Аватар для gum_classis
 
gum_classis в состоянии испепелить взглядомgum_classis в состоянии испепелить взглядомgum_classis в состоянии испепелить взглядомgum_classis в состоянии испепелить взглядомgum_classis в состоянии испепелить взглядомgum_classis в состоянии испепелить взглядомgum_classis в состоянии испепелить взглядомgum_classis в состоянии испепелить взглядомgum_classis в состоянии испепелить взглядомgum_classis в состоянии испепелить взглядомgum_classis в состоянии испепелить взглядом
Регистрация: 03.04.2011
Сообщений: 128
Популярность: 5379
Сказал(а) спасибо: 137
Поблагодарили 209 раз(а) в 111 сообщениях
Отправить сообщение для gum_classis с помощью ICQ Отправить сообщение для gum_classis с помощью Skype™
 
По умолчанию Re: Создание Потоков

Цитата:
Сообщение от VeTaL_UAПосмотреть сообщение
Цитата:

Сообщение от gum_classisПосмотреть сообщение



procedure TForm1.Button1Click(Sender: TObject);
begin
MyThread:=TMyThread.Create(False);
MyThread.Priority:=tpNormal;
MyThread.FreeOnTerminate:=true;
end;


Запустить поток и потом начать изменять параметры?

Наоборот!,сначала настроить всё а потом уже запускать!
  Ответить с цитированием
Старый 19.02.2012, 09:46   #4
Знаток Dark Orbit
 Рыцарь-защитник
Аватар для Mebius
 
Mebius трижды герой Советского СоюзаMebius трижды герой Советского СоюзаMebius трижды герой Советского СоюзаMebius трижды герой Советского СоюзаMebius трижды герой Советского СоюзаMebius трижды герой Советского СоюзаMebius трижды герой Советского СоюзаMebius трижды герой Советского СоюзаMebius трижды герой Советского СоюзаMebius трижды герой Советского СоюзаMebius трижды герой Советского Союза
Регистрация: 14.06.2010
Сообщений: 584
Популярность: 6626
Сказал(а) спасибо: 86
Поблагодарили 847 раз(а) в 266 сообщениях
Отправить сообщение для Mebius с помощью ICQ Отправить сообщение для Mebius с помощью Skype™
 
По умолчанию Re: Создание Потоков

Цитата:
Сообщение от gum_classisПосмотреть сообщение
Наоборот!,сначала настроить всё а потом уже запускать!

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

так же одно замечание, TThread это НЕ ОБЪЕКТ, а класс!!! обьектом в мастере он обозван тк создается новый юнит с шаблоном кода. так же замечание, раз уж рассказал про поток, надо было предусмотреть, что желающие писать доп поток обязательно захотят сделать какой либо вывод на форму или другой компонент в программе => надо описать вариант синхронизации и критической секции, так же пояснить, к каким последствиям может привести попытка передачи данных из потока в другой поток (форма тоже отдельный поток!) без синхронизации или критической секции. а такая передача может пройти гладко, а может превратить память отданую под прогу в месево непонятных кусокв бог знает чего.

Последний раз редактировалось Mebius; 07.03.2012 в 22:07.
  Ответить с цитированием
Старый 19.02.2012, 14:43   #5
Бандеровец
 Лейтенант-командор
Аватар для VeTaL_UA
 
VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(VeTaL_UA сломал счётчик популярности :(
Регистрация: 12.08.2010
Сообщений: 727
Популярность: 30569
Золото Zhyk.Ru: 1
Сказал(а) спасибо: 57
Поблагодарили 645 раз(а) в 386 сообщениях
Отправить сообщение для VeTaL_UA с помощью ICQ Отправить сообщение для VeTaL_UA с помощью Skype™
 
По умолчанию Re: Создание Потоков

Цитата:
Сообщение от gum_classisПосмотреть сообщение
Наоборот!,сначала настроить всё а потом уже запускать!

Так ты же наоборот сделал
________________
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов
Кошельки: 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, 10:21   #6
Super Moderator
 Сержант
Аватар для Рэйзор
 
Рэйзор сломал счётчик популярности :(Рэйзор сломал счётчик популярности :(Рэйзор сломал счётчик популярности :(Рэйзор сломал счётчик популярности :(Рэйзор сломал счётчик популярности :(Рэйзор сломал счётчик популярности :(Рэйзор сломал счётчик популярности :(Рэйзор сломал счётчик популярности :(Рэйзор сломал счётчик популярности :(Рэйзор сломал счётчик популярности :(Рэйзор сломал счётчик популярности :(
Регистрация: 20.07.2010
Сообщений: 137
Популярность: 26409
Сказал(а) спасибо: 52
Поблагодарили 566 раз(а) в 197 сообщениях
 
По умолчанию 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 как вы собрались чего-то настраивать в объекте, когда он еще даже не создан?
________________
-> Keep2Me <-
  Ответить с цитированием
Старый 22.05.2012, 15:05   #7
 Разведчик
Аватар для pavel!
 
pavel! никому не известный тип
Регистрация: 30.09.2010
Сообщений: 4
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Создание Потоков

Ребят не могу остановить поток.
в глобал вар написал:
pause: TNewThread; // TNewThread мой поток
Потом кидаю кнопку которая остановит поток и пишу в ней:
pause.Terminate;
Запускаю, сначало жму старт, запускаю поток , потом жму паузу и вылетает ошибка, а поток дальше работает ._.
создавать булевую переменную , на форму труе, в кнопке фалсе тоже пробовал, но поток не останавливается ._.
  Ответить с цитированием
Ответ


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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Куплю] Куплю брут для фришек в 10 потоков минимум.. erglo5 Товары/услуги в Сети 1 19.02.2012 22:14
[Помогите!] создание NPC??? edaks Вопросы и ответы, обсуждения 15 09.07.2010 14:37

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 19:53.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net