Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.01.2013, 21:29   #11
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
скажите прямо в чем проблема
Проблема в стратегии.
Задача как звучит?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.01.2013, 21:32   #12
bakanaev
Форумчанин
 
Регистрация: 27.03.2012
Сообщений: 438
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Проблема в стратегии.
Задача как звучит?
Дается список доменов, заходим на каждый и ищем текст заданный в Edit1, если нашли то сохраняем домен в txt. Многопоток.
Собственно все
bakanaev вне форума Ответить с цитированием
Старый 12.01.2013, 21:42   #13
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Замечательно. Перепиши поток так чтоб он работал только с переданным ему доменом при создании а не подтягивал его откуда-то.
Код:
   for j := 0 to links.Count-1 do
   begin
     with TNewThread.Create(false) do begin
      domain:=links[i];
      fnd_text:=Edit1.Text;
     end;
   end;
И сам класс:
Код:
procedure TNewThread.Execute;
var  IdHTTP1:TIdHTTP;

     html:string;
begin
    IdHTTP1:=TIdHTTP.Create;
      try
       html:=IdHTTP1.Get(trim(domen));
      except  end;
      if pos (fnd_text,html) <> 0 then Rez:='GOOD|'+domen
     else Rez:='NOT';
     Synchronize(Sync);
     IdHTTP1.Free;
end;
Ессно fnd_text сделай public свойством треады. Не надо в самом потоке делать выборку следующего анализируемого домена. Для этого нужно конструировать пул потоков, чего у тебя нет, так что не вешай себе геморрой на точку сидения.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.01.2013, 21:45   #14
bakanaev
Форумчанин
 
Регистрация: 27.03.2012
Сообщений: 438
По умолчанию

Код:
   for j := 0 to links.Count-1 do
   begin
     with TNewThread.Create(false) do begin
      domain:=links[i];
      fnd_text:=Edit1.Text;
     end;
   end;
ссылок пару миллионов)
bakanaev вне форума Ответить с цитированием
Старый 12.01.2013, 22:41   #15
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Значит делай пулл потоков на скажем 100 потоков. Пусть пулл следит, если какой либо поток закончил работу - создавать новый, передавая ему новый линк.
Далее: А зачем собственно нужно много потоков? Пусть будет один, но идет по списку последовательно. Все равно особого выигрыша в скорости не получишь.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.01.2013, 22:44   #16
bakanaev
Форумчанин
 
Регистрация: 27.03.2012
Сообщений: 438
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Далее: А зачем собственно нужно много потоков? Пусть будет один, но идет по списку последовательно. Все равно особого выигрыша в скорости не получишь.

Это почему? скорость значительно увеличивается)))
bakanaev вне форума Ответить с цитированием
Старый 12.01.2013, 23:02   #17
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

До поры до времени. Пока ты в рамках 10-100 потоков да, потом будет хуже.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.01.2013, 08:35   #18
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

никто не ответил на главой вопрос темы.у вашего друга вылетает возможно потому,что в процедуре savetofile() возникает av в случае,если файл не создан.вы перезаписываете его и закрываете.а вот снова вызвать assignfile забываете.возможно поэтому каждый поток при попытке записи в неоткрытый файл выдает ошибку.

да и сам код под вопросом.делайте логику отдельным классом.вроде описали свой класс потока,а выводы от этого немного.все размазано сильно.критическая секцию нужна для обращения к разделяемым ресурсам,а синхронизация-для безопасного обращения к свойствам визуальных компонентов.а это не одно и то же.
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 14.01.2013, 11:00   #19
bakanaev
Форумчанин
 
Регистрация: 27.03.2012
Сообщений: 438
По умолчанию

Цитата:
вы перезаписываете его и закрываете.а вот снова вызвать assignfile забываете.
Функция не моя. Спасибо за совет.
Так будет правельно?
Код:
function    TNewThread.SaveToFile(str:string; FileDir:String): string;
var f:TextFile;

begin
if not FileExists(FileDir) then
 begin
  AssignFile(f,FileDir);
  Rewrite(f);
  CloseFile(f);
 end;

AssignFile(f,FileDir);
Append(f);
Writeln(f,str);
Flush(f);
CloseFile(f);
end;
Цитата:
критическая секцию нужна для обращения к разделяемым ресурсам,а синхронизация-для безопасного обращения к свойствам визуальных компонентов.
Т.е если я увеличиваю скажем i (ее используют все потоки). То нужно использовать критическую секцию?
Что на счет функции SaveToFlie ? Ее через что вызывать?

Цитата:
критическая секцию нужна для обращения к разделяемым ресурсам,а синхронизация-для безопасного обращения к свойствам визуальных компонентов.
Т.е если я увеличиваю скажем i (ее используют все потоки). То нужно использовать критическую секцию?
Что на счет функции SaveToFlie ? Ее через что вызывать?

Последний раз редактировалось Stilet; 14.01.2013 в 11:10.
bakanaev вне форума Ответить с цитированием
Старый 14.01.2013, 11:13   #20
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Так будет правельно?
Так будет бессмысленно. Используй TStringList. Если файл один для всех потоков пиши в него из синхронизированной процедуры. А потом по окончанию программы сливай все в файл.

Или уж так:
Код:

function    TNewThread.SaveToFile(str:string; FileDir:String): string;

begin
 with  TFileStream.Create(FileDir,fmCreate) do begin
  write(str[1],Length(str));
  Free;
 end;
end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Бесплатный софт generalissimus4 Софт 144 18.11.2022 18:47
ИГРОВОЙ СОФТ ffk_ffk Фриланс 14 22.04.2010 20:39
СОФТ, банковское ПО Злата Свободное общение 1 10.04.2008 13:36
Математический софт! Mr.User Софт 4 08.12.2007 06:51