PDA

Просмотр полной версии : [Статья] Потоки в Delphi


lolwut98
25.07.2011, 17:25
Всем привет. Не нашёл тут темы, в которой рассказывается о использовании потоков. Создам свою.

Для чего нужны потоки? Для того, чтобы выполнять в них какую-либо задачу, и чтобы при этом форма не зависала. Вот как их создавать:

пишем вот этот код после type:

type
MyThr = class(TThread)
protected
procedure Execute; override;
end;

потом нажимаем ctrl+shift+c и видим, что появилось вот это:

procedure MyThr.Execute;
begin
inherited;

end;

это и есть тело потока. здесь пишем наш код. например:

procedure MyThr.Execute;
var
i:integer;
begin
for i:=0 to 2000 do
Application.MainForm.Memo1.Lines.Add(inttostr(i));
end;

для того, чтобы этот код работал, надо кинуть на форму TMemo.
Если вы напишете Memo1.Lines.Add(inttostr(i)), то это не будет работать, т.к. Memo1 принадлежит форме, а не потоку. Для того, чтобы код работал, надо обратиться к Memo1 через форму, как это показано в коде повыше.

потом кидаем на форму 1 TButton. В обработчике OnClick пишем:

MyThr.Create(false);

Должно получиться что-то вроде этого:
procedure TForm1.Button1Click(Sender: TObject);
begin
MyThr.Create(false);
end;

Всё. Готово. Можете запускать проект. Когда вы нажмёте на кнопку, то в Memo1 будут добавляться цифры от 0 до 2000. И форма не будет зависать. Если вам надо остановить поток, то напишите


MyThr.Suspend;


Чтобы опять его запустить, надо написать

MyThr.Resume;


А чтобы убить поток, то пишите

MyThr.Terminate;


Можете это использовать как хотите. Например, сделать в потоке авторизацию и т.п.
Удачи :)

Dinmaite
25.07.2011, 19:58
У меня есть форма, на ней есть ресурс - компонент Edit1.
Я хочу в потоке читать значение из Edit'a.
Потоков у меня 7 тысяч.
Как мне поступить?

PS. Только не мне отвечай, а в тему добавь.

llbumerll
30.03.2013, 17:07
у меня на форме есть компонент
Timer1

когда я его пытаюсь остановить потоком, то мне выдаёт ошибку

Application.MainForm.Timer1.Enabled:=false;

то есть поток не видит вообще компонентов с формы

metraz
30.03.2013, 18:11
у меня на форме есть компонент
Timer1

когда я его пытаюсь остановить потоком, то мне выдаёт ошибку

Application.MainForm.Timer1.Enabled:=false;

то есть поток не видит вообще компонентов с формы

Потому что ты не можешь из дополнительного потока изменять свойства объекта с потока основного.
Делай это через синхронизацию.

llbumerll
31.03.2013, 04:19
Потому что ты не можешь из дополнительного потока изменять свойства объекта с потока основного.
Делай это через синхронизацию.

можно какойнибудь примерчик, как ето делается ?

metraz
31.03.2013, 11:32
procedure potok.execute;
begin
{тут код}
synchronize(sync); ////sync объявлен в разделе паблик у потока
end;

procedure potok.sync;
begin
form1.timer1.enabled:=false;
end;

llbumerll
03.04.2013, 21:01
Если вам надо остановить поток, то напишите


MyThr.Suspend;


Чтобы опять его запустить, надо написать

MyThr.Resume;


А чтобы убить поток, то пишите

MyThr.Terminate;


Можете это использовать как хотите. Например, сделать в потоке авторизацию и т.п.
Удачи :)

ети функции неработают, а мне надо както убить поток =(

metraz
03.04.2013, 21:13
эти команды всегда работают) Если не работают, то дело в вас)

llbumerll
03.04.2013, 21:43
эти команды всегда работают) Если не работают, то дело в вас)

Delphi XE3 , делаю поток
в первую кнопку пишу MyThr.Create(False);
поток работает отлично.
во вторую кнопку начинаю писать MyThr.Ter он даже не предлагает эту функцию, дописываю до конца MyThr.Terminate; ошибку не подчёркивает, но при компиляции ошибка и выделяет MyThr.Terminate; красным

вот отдельно сделал пример ([Ссылки могут видеть только зарегистрированные и активированные пользователи])

Добавлено через 3 часа 3 минуты
metraz, загляни пожалуйста в тему потоки

metraz
04.04.2013, 09:05
он даже не предлагает эту функцию
В глобалньом варе пишешь "potok: mythr;"
а потом уже
potok.FreeOnTerminate:=True;
potok.Terminate;
potok:=nil;

llbumerll
04.04.2013, 15:18
В глобалньом варе пишешь "potok: mythr;"
а потом уже
potok.FreeOnTerminate:=True;
potok.Terminate;
potok:=nil;


спс, скачал библию Михаила Фленова, там тоже самое ток поподробнее расписанно, наконецто понял как с потоками творить чудеса )))
вот только почемуто если добовляю юнит THread1 а в главной форме пытаюсь в Uses прописать MyThread то подчёркивает красным, типо MyThread уже обьявлена или он низнает что ето, поетому пришлоть делать как сказанно в етой теме писать поток в ручную, ну хоть както )))

avi2011class
06.04.2013, 16:12
А потоки сильно на производительность влияют?

Dinmaite
06.04.2013, 16:44
А потоки сильно на производительность влияют?
Производительность чего?

Рэйзор
06.04.2013, 18:24
спс, скачал библию Михаила Фленова, там то_же самое, только поподробнее расписано, наконец-то понял, как с потоками творить чудеса )))
вот только почему-то, если добавляю юнит TThread1, а в главной форме пытаюсь в Uses прописать MyThread, то подчёркивает красным, типо MyThread уже объявлен, или среда не знает, что это, поэтому пришлось делать так, как сказано в этой теме, писать поток вручную, ну хоть как-то )))

А зачем пытаться писать в uses имя класса? Имя используемого модуля туда писать не пробовали?
И как это может быть: "MyThread уже объявлен, или среда не знает, что это" ??
Вы сообщения об ошибках читаете? Там обычно ясно написано, что и куда.

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

VeTaL_UA
07.04.2013, 11:50
пытаюсь в Uses прописать MyThread
пропиши туда TThread1 /facepalm