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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.01.2012, 10:45   #1
nikol_
Пользователь
 
Регистрация: 24.02.2011
Сообщений: 16
По умолчанию Пул потоков

Приветствую всех магистров Темной и Светлой стороны Силы

есть такая проблема:
в потоке запускаются дополнительные треды:
Код:
/////////////////////////
var     pool: array of TLifeOfItem;
/////////////////////////
      am:=length(pool);
      setlength(pool,am+1);
      pool[am]:=TLifeOfItem.Create(idNewItem,'Поток №' + IntToStr(am+1),IdCookieM);
      pool[am].Start;
Каждый из дополнительных тредов должен выполнять какие-то действия и он их выполняет, пока в пул не добавляется новый поток. После добавления нового, предыдущий(е) поток(и) замещаются/останавливаются, короче - куда-то пропадают.

С чем это связано? Что делаю не так?

Последний раз редактировалось nikol_; 24.01.2012 в 13:31.
nikol_ вне форума Ответить с цитированием
Старый 25.01.2012, 11:23   #2
nikol_
Пользователь
 
Регистрация: 24.02.2011
Сообщений: 16
По умолчанию

Неужели никаких идей?
nikol_ вне форума Ответить с цитированием
Старый 25.01.2012, 12:07   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
и он их выполняет, пока в пул не добавляется новый поток. После добавления нового, предыдущий(е) поток(и) замещаются/останавливаются, короче - куда-то пропадают.

С чем это связано? Что делаю не так?
Парадокса не находите...?

Может быть пул неправильно организован?
Человек_Борща вне форума Ответить с цитированием
Старый 25.01.2012, 19:10   #4
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
С чем это связано? Что делаю не так?
Ошибка в 13-й строке.

Что вы делаете не так - вы неправильно задаёте вопросы.

Что значит пропадает поток? Как вы это определяете? Где код потоков?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.

Последний раз редактировалось Stilet; 25.01.2012 в 21:47.
GunSmoker вне форума Ответить с цитированием
Старый 25.01.2012, 19:20   #5
nikol_
Пользователь
 
Регистрация: 24.02.2011
Сообщений: 16
По умолчанию

Парадокса не нахожу, потому что его нет.

Посмотрите на код:
Код:
/////////////////////////
var     pool: array of TLifeOfItem; // глобальный массив для "хранения" потоков
/////////////////////////
      am:=length(pool);  // узнаю сколько в массиве сейчас потоков
      setlength(pool,am+1); // выделяю место под НОВЫЙ поток
      pool[am]:=TLifeOfItem.Create(idNewItem,'Поток №' + IntToStr(am+1),IdCookieM); // создаю НОВЫЙ поток и пихаю его в массив.
      pool[am].Start; // запускаю НОВЫЙ созданный поток
Никаких действий с предыдущими потоками не произвожу, но они куда-то деваются/замещаются/останавливаются, короче - куда-то пропадают.
nikol_ вне форума Ответить с цитированием
Старый 25.01.2012, 19:26   #6
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
они куда-то деваются/замещаются/останавливаются, короче - куда-то пропадают
Крайне занимательная формулировка.

"У меня произошло то, не знаю что. В чём дело?"

Приходите, когда узнаете.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 25.01.2012, 21:07   #7
nikol_
Пользователь
 
Регистрация: 24.02.2011
Сообщений: 16
По умолчанию

Надеюсь все самоутвердились?

Код TLifeOfItem:
Код:
constructor TLifeOfItem.Create(it: string; text: string; cm: TIdCookieManager);
Begin
  IdCookieM := cm;
  IdHTTP := TIdHttp.Create();
  IdHTTP.CookieManager := IdCookieM;
  IdHTTP.HandleRedirects := true;

  id := it;
  name := text;

  inherited Create(true);
End;


procedure TLifeOfItem.addToLog(log: string);
var
  today: TDateTime;
Begin
  today := Time;
  toLog := name + ': [' + TimeToStr(today) + '] - ' + log;
  Synchronize(SendToLog);
End;

procedure TLifeOfItem.SendToLog;
Begin
  Form2.Memo2.Lines.Append(toLog);
End;

procedure TLifeOfItem.Execute;
var
  str, t, item, p1, status: string;
  p: integer;

  flag: boolean;

  m: TIdMultiPartFormDataStream;
begin
  addToLog('Начата обработка итема - [' + id + ']');
  while(nthread.isWork) do
  Begin
    addToLog(' обработка итема - [' + id + ']');
    sleep(1000);
  End;
end;
Из приложения запускается поток обработки TNewThread, этот поток и создает экземпляры TLifeOfItem.
Объявление в TNewThread массива TLifeOfItem
Код:
/////////////////////////
var     pool: array of TLifeOfItem; // глобальный массив для "хранения" потоков
/////////////////////////
Ниже код, который выполняется в Execute этого потока. Лишнее выбросил
Код:
      am:=length(pool);  // узнаю сколько в массиве сейчас потоков
      setlength(pool,am+1); // выделяю место под НОВЫЙ поток
      pool[am]:=TLifeOfItem.Create(idNewItem,'Поток №' + IntToStr(am+1),IdCookieM); // создаю НОВЫЙ поток и пихаю его в массив.
      pool[am].Start; // запускаю НОВЫЙ созданный поток
В лог выводится вот текст:

Цитата:
[18:52:48] - Добавление нового итема
[18:52:48] - Получение новой капчи
[18:52:48] - !1
[18:52:59] - Капча получена - m58zk8
[18:53:10] - Добавлен новый итем [401959]
Поток №1: [18:53:10] - Начата обработка итема - [401959]
Поток №1: [18:53:10] - Поток №1 обработка итема - [401959]
Поток №1: [18:53:11] - Поток №1 обработка итема - [401959]

[18:53:12] - Добавление нового итема
Поток №1: [18:53:12] - Поток №1 обработка итема - [401959]
[18:53:12] - Получение новой капчи
[18:53:12] - !1
Поток №1: [18:53:13] - Поток №1 обработка итема - [401959]
Поток №1: [18:53:14] - Поток №1 обработка итема - [401959]
[18:53:18] - Капча получена - h99wr6
Поток №1: [18:53:19] - Поток №1 обработка итема - [401959]
[18:53:19] - Капча распознана не верно
[18:53:19] - Получение новой капчи
[18:53:19] - !1
Поток №1: [18:53:20] - Поток №1 обработка итема - [401959]
Поток №1: [18:53:35] - Поток №1 обработка итема - [401959]
[18:53:35] - Капча получена - n8kwef
Поток №1: [18:53:36] - Поток №1 обработка итема - [401959]
Поток №1: [18:53:40] - Поток №1 обработка итема - [401959]
[18:53:40] - Добавлен новый итем [401964]
Поток №2: [18:53:40] - Начата обработка итема - [401964]
Поток №2: [18:53:40] - Поток №2 обработка итема - [401964]

Поток №2: [18:53:42] - Поток №2 обработка итема - [401964]

[18:53:42] - Добавление нового итема
Поток №2: [18:53:42] - Поток №2 обработка итема - [401964]
[18:53:43] - Получение новой капчи
[18:53:43] - !1
Поток №2: [18:53:43] - Поток №2 обработка итема - [401964]
Поток №2: [18:53:53] - Поток №2 обработка итема - [401964]
Поток №2: [18:53:53] - Поток №2 обработка итема - [401964]
[18:53:54] - Капча получена - 38nw
Поток №2: [18:53:54] - Поток №2 обработка итема - [401964]
Поток №2: [18:53:54] - Поток №2 обработка итема - [401964]
[18:53:55] - Капча распознана не верно
[18:53:55] - Получение новой капчи
[18:53:55] - !1
Поток №2: [18:53:55] - Поток №2 обработка итема - [401964]
Поток №2: [18:54:37] - Поток №2 обработка итема - [401964]
Поток №2: [18:54:37] - Поток №2 обработка итема - [401964]
[18:54:37] - Капча получена - 68y2bt
Поток №2: [18:54:38] - Поток №2 обработка итема - [401964]
Поток №2: [18:54:40] - Поток №2 обработка итема - [401964]
Поток №2: [18:54:40] - Поток №2 обработка итема - [401964]
[18:54:40] - Добавлен новый итем [401973]
Поток №3: [18:54:40] - Начата обработка итема - [401973]
Поток №3: [18:54:42] - Поток №3 обработка итема - [401973]

[18:54:42] - Добавление нового итема
Поток №3: [18:54:43] - Поток №3 обработка итема - [401973]
[18:54:43] - Получение новой капчи
[18:54:43] - !1
Поток №3: [18:54:43] - Поток №3 обработка итема - [401973]
Поток №3: [18:54:54] - Поток №3 обработка итема - [401973]
[18:54:54] - Капча получена - 22tp6w
Поток №3: [18:54:54] - Поток №3 обработка итема - [401973]
Поток №3: [18:55:04] - Поток №3 обработка итема - [401973]
[18:55:04] - Добавлен новый итем [401976]
Поток №4: [18:55:04] - Начата обработка итема - [401976]
Поток №4: [18:55:04] - Поток №4 обработка итема - [401976]
Поток №4: [18:55:06] - Поток №4 обработка итема - [401976]
Как видно из лога - Поток №1 перестал выводить сообщения после того, как добавился новый Поток№2 и так далее...

Надеюсь теперь понятно изложил?
nikol_ вне форума Ответить с цитированием
Старый 25.01.2012, 21:12   #8
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Ваш лог не соответствует коду. В том коде, который показан, проблемы нет. Продолжаем играть в угадайку?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 25.01.2012, 21:20   #9
nikol_
Пользователь
 
Регистрация: 24.02.2011
Сообщений: 16
По умолчанию

Ы_ы) Несоответствие только в выводе в лог: параметр Name добавлял в вызове AddToLog и в коде самого AddToLog'a к переменной toLog тоже добавлялся Name

Лог был получен по приведенному выше коду.

К сожалению, угадайка не интересна, потому не играю.

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
В том коде, который показан, проблемы нет.
Понимаете, GunSmoker, я тоже не наблюдаю в коде проблемы, но код который идет перед созданием потоков не критичен и он не обращается к ранее созданным потокам, вообще, никак, даже косвенно, даже не читает оттуда.

В сокращенном виде код потока TNewThread выглядит так:
Код:
procedure TNewThread.Work;
var
  str, idNewItem,fc: String;
  i,p: integer;
  m: TIdMultiPartFormDataStream;
  th: TLifeOfItem;
  flag: boolean;
  am: integer;
begin
  while isWork do
  Begin
    Synchronize(Form2.Memo2.Lines.Clear); // очищается лог для этой сессии
    GetAllItem; // грузятся и запоминаются все объявления запощенные до этой сессии

    for i := 0 to listImg.Count - 1 do // цикл для добавления объявлений переданных потоку
    Begin

      if not isWork then 
        exit;

      AddToLog('');

      AddToLog('Добавление нового итема'); 

      repeat  // цикл по заполнению параметров объявления

        str := IdHTTP.Get(addUrl); // грузится страница с капчей
        str := getUrlCapchaImg(str); // парсинг урла на капчу

        fc := getCapchaImg(str); // сохранение капчи и возврат пути к сохраненной кпче
        if captcha = '' then
          AddToLog('Получение новой капчи')
        else
          Begin
            AddToLog('Капча распознана не верно');
            AddToLog('Получение новой капчи');
          End;

        AddToLog('!1');

        captcha := recognize(fc, key, false, false, false, 0, 0); // расспознавание капчи
        p:=pos('ERROR_',captcha); // контроль ответа от расспознавателя
        while p<>0 do 
        Begin
          captcha := recognize(fc, key, false, false, false, 0, 0);
          sleep(3000);
          p:=pos('ERROR_',captcha);
          AddToLog(captcha);
        End;

        AddToLog('Капча получена - ' + captcha);

        m := TIdMultiPartFormDataStream.Create; 
        // формирование объявления и его отправка
        doSendImg(listImg[i]);
        m.AddFormField('action', 'add');
        m.AddFormField('id', '');
        m.AddFormField('image_filename', loadimg);
        m.AddFormField('title',AnsiToUtf8(listTimes[i]),'utf-8').ContentTransfer:='8bit';
        m.AddFormField('announce', '');
        m.AddFormField('url', Form2.Edit5.Text);
        m.AddFormField('group_id', '0');
        m.AddFormField('captcha', captcha);
   
        str:=IdHTTP.Post(addUrl, m);
        m.Free;

      until pos('Вы неверно ввели код с картинки.',str) = 0; // если не отправилось - повторяем все начиная с капчи

      loadimg := '';
      captcha := '';

      // парсим id добавленного объявления
      p := pos('<tr class="row',str);
      delete(str,1,p);
      p := pos('value="',str);
      delete(str,1,p);
      delete(str,1,pos('lue="',str)+4);
      delete(str,pos('</form>',str),length(str));

      idNewItem := copy(str,1,pos('"',str)-1);

      itemsInWork.Append(idNewItem); // добавляем id добавленного объявления в список
      addToLog('Добавлен новый итем [' + idNewItem + ']');
 

      ///// ЗАПУСК ПОТОКА ОБРАБОТКИ ДЛЯ НОВОГО ОБЪЯВЛЕНИЯ
      am:=length(pool);
      setlength(pool,am+1);
      pool[am]:=TLifeOfItem.Create(idNewItem,'Поток №' + IntToStr(am+1),IdCookieM);
      pool[am].Start;
      sleep(StrToInt(Form2.loginpass[3])*1000);
      ////////////////////////////////////////
    End;

    addToLog('');
    addToLog('___________________________________');
    addToLog('Загрузка итемов завершена');
    addToLog('Идет обработка... Итемов осталось в обработке [' + IntToStr(itemsInWork.Count) + ']');
    addToLog('');
    addToLog('Ожидание конца обработки');
    while itemsInWork.Count>0 do
      Sleep(1000*600);

  End;
end;

Последний раз редактировалось nikol_; 25.01.2012 в 21:36.
nikol_ вне форума Ответить с цитированием
Старый 25.01.2012, 21:22   #10
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

В коде нет "Капча распознана не верно" и "Добавление нового итема", а в логе они есть. Поэтому вы врёте.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание потоков cargo29 Общие вопросы Delphi 16 07.08.2011 12:11
Приоритеты потоков Soundkilla Помощь студентам 1 24.04.2011 19:37
Синхронизация потоков в С++ erazer89 Помощь студентам 0 27.04.2010 20:14
Остановка потоков по ID steelforce Общие вопросы Delphi 2 24.01.2010 16:50