Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TThread как становить\ удалить потоки 
:(
    Опции темы
InfectedM
Дата 23.1.2010, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 21.10.2007

Репутация: нет
Всего: нет



при нажатии на кнопку создаеться столько потоков сколько существует записей в memo1

допустим я создал 50 потоков.
1)как мне остановить вручнудю все эти 50 потоков и удалить их?
2)чтобы потоки удалились нужно в конце писать   self.Terminate;  self.free; ? или он сам удаляеться
3)как остановить например только 10-ый поток?
подскажите пожалуйса.


Код

procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
begin
  for i := 0 to Memo1.Lines.Count - 1 do begin
    TMyThread.Create(false, Memo1.lines[i]);
  end;
end;



Код


 type
 TMyThread = class(TThread)
  private
    FUrl: string;
  public
    constructor Create(CreateSuspended: Boolean; AUrl: string);
  protected
    procedure Execute; override;
    procedure UpdateCaption;
  end;

implementation

uses Unit1;



constructor TMyThread.Create(CreateSuspended: Boolean; AUrl: string);
begin
  inherited Create(CreateSuspended);
  FUrl := AUrl;
  FreeOnTerminate := true;
end;

procedure TMyThread.Execute;
var
  http: TIdHTTP;
  str: TStringList;
begin
str := TStringList.Create();
  http := TIdHTTP.Create(nil);
  str.Text:= http.Get(FUrl);

    sleep(7000);
      str.SaveToFile(inttostr(random(222))+'.html');
      
  http.Free;
  str.free ;
  Synchronize(UpdateCaption);
  // self.Terminate;
     //self.free;
end;

procedure TMyThread.UpdateCaption;
begin
  Form1.Memo2.Lines.Add(FUrl);
end;


PM MAIL   Вверх
Nofate
Дата 25.1.2010, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 266
Регистрация: 13.10.2008

Репутация: нет
Всего: 8



1. Для этого нужно хотя бы куда-то запомнить эти потоки, чтобы обращаться к ним впоследствии.
Код

var
  threads: array of TMyThread;  

procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
begin
  setLength(threads, Memo1.Lines.Count);
  for i := 0 to Memo1.Lines.Count - 1 do begin
    threads[i] := TMyThread.Create(false, Memo1.lines[i]);
  end;
end;


Конечно, лучше хранить их в списке или как-то еще, но это уже зависит от конкретной задачи.

2. Terminate вызывается извне для остановки потока (см пункт 3). Free вызывается на том же уровне, где вы создали поток (например при закрытии окна, если дочерние потоки больше не нужны). Есть еще Suspend - он приостанавливает поток и выполнение дальше можно продолжить через Resume.

3. Как следствие п1. и п.2:
Код

var
  threads: array of TMyThread;  
....
//остановим-ка поток №10
threads[10].terminate;
....



--------------------
The future is not set, there is no fate but what we make for ourselves.
Нофейтово пространство и смежные области 
PM MAIL WWW ICQ   Вверх
Alca
Дата 25.1.2010, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: нет
Всего: 50



Код

var
  threads: array of TMyThread;  
....
//остановим-ка поток №10
threads[10].terminate;
threads[10].WaitFor;    //ждем завершения потока
....

Nofate, а так можно (если FreeOnTerminate := true;)?


--------------------
PM WWW ICQ Skype Jabber   Вверх
Демо
Дата 25.1.2010, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 6
Всего: 50



Цитата(Alca @  25.1.2010,  15:37 Найти цитируемый пост)
Nofate, а так можно (если FreeOnTerminate := true;)?


Нет. В этом случае рискуешь обратиться к методу WaitFor уже после того, как TThread уничтожится.


--------------------
    
PM MAIL ICQ Skype   Вверх
InfectedM
Дата 9.2.2010, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 21.10.2007

Репутация: нет
Всего: нет



создаю один поток threads[1] 
memo1 начинает заполняться.....


Код

procedure TMyThread.Execute;
....

 while true do begin  Synchronize(UpdateCaption); end;////
....
end;

procedure TMyThread.UpdateCaption;
begin
  Form1.Memo2.Lines.Add('AAAAAAAAAAA');
end;


тыкаю на кнопку : threads[1].Suspend; - поток останавливается.
Тыкаю на threads[1].resume; он снова запускатся,все работает отлично.

затем я его останавливаю и пытаюсь удалить через threads[1].terminate; . но ничего не удаляеться(( после нажатия на resume он опять продолжает работать
подскажите что не так 
PM MAIL   Вверх
Alca
Дата 10.2.2010, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: нет
Всего: 50



Код

while true do begin  Synchronize(UpdateCaption); end;////

Как ты думаешь, это бесконечный цикл или нет?


--------------------
PM WWW ICQ Skype Jabber   Вверх
InfectedM
Дата 10.2.2010, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 21.10.2007

Репутация: нет
Всего: нет





 во время выполнения цикла нельзя удалить поток?

как тогда цикл остановить можно в потоке по моему запросу?


 

Это сообщение отредактировал(а) InfectedM - 10.2.2010, 18:28
PM MAIL   Вверх
Alca
Дата 10.2.2010, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: нет
Всего: 50



Код

        if (true == this->Terminated) {
            break;
        }


Добавлено через 2 минуты и 34 секунды
Посмотри исходники класса TThread и его метода Terminate


--------------------
PM WWW ICQ Skype Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0569 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.