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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поток не завершается 
:(
    Опции темы
AriX
Дата 24.10.2004, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот утрированный код
Код

procedure TForm1.Button1Click(Sender: TObject);
var
 i: integer;
begin
 for i := 0 to Memo1.Lines.Count - 1 do begin
   TMyThread.Create(false, Memo1.Strings[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

{ TMyThread }

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

procedure TMyThread.Execute;
var
 http: TIdHTTP;
begin
 http := TIdHTTP.Create(nil);
 http.Get(FUrl);
 http.Free;
 Synchronize(UpdateCaption);
end;

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


В Memo1 содержится список урлов.
При нажатии на кнопку запускается несколько потоков, каждый из которых скачивает определенную страничку. По завершении скачивания в Memo2 пишется урл скаченной странички.
IdHTTP - это из Indy Clients

Вся проблемы в том, что потоки не завершаются! Т.е. они завершаются, кроме одного.
И получается, что до нажатия на кнопку есть только один основной поток - а после скачивания их уже два.

Причем если, например, закоментировать строчку
Код
http.Get(FUrl);
то потоки прекрасно завершаются :)

Что тут можно сделать? Заранее ОГРОМНОЕ Спасибо!!!

PM MAIL   Вверх
p0s0l
Дата 24.10.2004, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

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



А в мемо у тебя результат от всех потоков приходит ?


--------------------
С уважением, г-н Посол.
PM   Вверх
AriX
Дата 25.10.2004, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



p0s0l
Ага. Т.е. если в Memo1 написано например:
Код
http://qwe.ru/
http://asd.ru/
http://zxc.ru/

то в Memo2 выводится примерно следующее (порядок может быть разным, в зависимости от скорости скачивания страницы):
Код
http://asd.ru/
http://zxc.ru/
http://qwe.ru/


Т.е. до Synchronize дело доходит. Но поток не завершается.
PM MAIL   Вверх
Girder
Дата 25.10.2004, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


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

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



Список дай... :) OC какая?


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
p0s0l
Дата 25.10.2004, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

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



А если принудительно завершить поток после вывода в Memo ?
Т.е. будет так:
Synchronize(UpdateCaption);
ExitThread(0);

Хотя конечно лучше бы выяснить, почему поток не завершается...

ЗЫ: как ты определяешь кол-во потоков в процессе ?


--------------------
С уважением, г-н Посол.
PM   Вверх
AriX
Дата 25.10.2004, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Girder
Цитата
Список дай

Не понял :) Какой список?
Цитата
OC какая?

WinXP

p0s0l
Попробовал ExitThread(0) - тоже самое :-/
Цитата
ЗЫ: как ты определяешь кол-во потоков в процессе ?

Прогой AnVir Task Manager (http://anvir.com/)

Вот на всякий случай моя прога (хотя она вся в первом посте :) ) - _http://picts4.nm.ru/ThreadProblem.rar
Там только в коде потока надо убрать параметры проксика.. Кстати, может из-за соединения через проксик такое?
PM MAIL   Вверх
p0s0l
Дата 25.10.2004, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

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



Вот у тебя осталось 2 потока, если еще раз прогонишь закачку - сколько в итоге останется: 2 или 3 ?
Если 2, то возможно IdHTTP создаёт вспомогательный поток (для чего-нибудь)... Прогу позднее гляну...



--------------------
С уважением, г-н Посол.
PM   Вверх
AriX
Дата 25.10.2004, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



После повторного запуска остается 2 потока.
Вероятно и правда дополнительный.
А как его можно завершить? Или можно не беспокоится - пусть будет?
PM MAIL   Вверх
p0s0l
Дата 25.10.2004, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

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



Наплюй на эти потоки - они создаются системой, значит нужны.
Даже такой код у меня создаёт 2 дополнительных потока:
Код
var
 wsad : WSAData;
 s : TSocket;
begin
 WSAStartup(2, wsad);
 s := socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
 CloseSocket(s);
 WSACleanup;
end;
А TIdHTTP.Get в итоге сводится как раз к вызову
socket(AF_INET, SOCK_STREAM, IPPROTO_IP);



--------------------
С уважением, г-н Посол.
PM   Вверх
AriX
Дата 25.10.2004, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



p0s0l
Ок, забью :)

СПАСИБО ОГРОМНОЕ!!!! :hehe
Добавлено @ 23:09
Млин, репутацию не могу повысить :) наберу сотню - займусь ;)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

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

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

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


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

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


 




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


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

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