Всем привет. Не нашёл тут темы, в которой рассказывается о использовании потоков. Создам свою.
Для чего нужны потоки? Для того, чтобы выполнять в них какую-либо задачу, и чтобы при этом форма не зависала. Вот как их создавать:
пишем вот этот код после 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;
Можете это использовать как хотите. Например, сделать в потоке авторизацию и т.п.
Удачи
Последний раз редактировалось lolwut98; 25.07.2011 в 20:28.
эти команды всегда работают) Если не работают, то дело в вас)
Delphi XE3 , делаю поток
в первую кнопку пишу MyThr.Create(False);
поток работает отлично.
во вторую кнопку начинаю писать MyThr.Ter он даже не предлагает эту функцию, дописываю до конца MyThr.Terminate; ошибку не подчёркивает, но при компиляции ошибка и выделяет MyThr.Terminate; красным
вот отдельно сделал [Ссылки могут видеть только зарегистрированные пользователи. ]
Добавлено через 3 часа 3 минуты metraz, загляни пожалуйста в тему потоки
Последний раз редактировалось llbumerll; 04.04.2013 в 00:46.
Причина: Добавлено сообщение
В глобалньом варе пишешь "potok: mythr;"
а потом уже
potok.FreeOnTerminate:=True;
potok.Terminate;
potok:=nil;
спс, скачал библию Михаила Фленова, там тоже самое ток поподробнее расписанно, наконецто понял как с потоками творить чудеса )))
вот только почемуто если добовляю юнит THread1 а в главной форме пытаюсь в Uses прописать MyThread то подчёркивает красным, типо MyThread уже обьявлена или он низнает что ето, поетому пришлоть делать как сказанно в етой теме писать поток в ручную, ну хоть както )))
Последний раз редактировалось llbumerll; 04.04.2013 в 16:44.
спс, скачал библию Михаила Фленова, там то_же самое, только поподробнее расписано, наконец-то понял, как с потоками творить чудеса )))
вот только почему-то, если добавляю юнит TThread1, а в главной форме пытаюсь в Uses прописать MyThread, то подчёркивает красным, типо MyThread уже объявлен, или среда не знает, что это, поэтому пришлось делать так, как сказано в этой теме, писать поток вручную, ну хоть как-то )))
А зачем пытаться писать в uses имя класса? Имя используемого модуля туда писать не пробовали?
И как это может быть: "MyThread уже объявлен, или среда не знает, что это" ??
Вы сообщения об ошибках читаете? Там обычно ясно написано, что и куда.
Прочитайте учебник по основам русского языка, прежде чем что-то писать.
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов
Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.