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

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

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

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

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

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

Обновил предыдущий пост. Теперь есть. Не вру, но не критичен этот код

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

Цитата:
но не критичен этот код
Это интересный подход. Вы не знаете, в чём проблема, но уже как-то определили, что её нет нигде, кроме вот этих вот пары строчек. Если вы так уверены, что проблемы там нет, то зачем задаёте вопрос?

Зато теперь, когда вы код привели, в последнем коде я вижу отсутствие синхронизации при доступе к pool, itemsInWork и, возможно, isWork (я не знаю точно, потому что код вы опять не привели).

Мой выстрел наугад: из-за отсутствия синхронизации поток ловит Access Violation и самоэкстерминируется.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 26.01.2012, 01:51   #13
nikol_
Пользователь
 
Регистрация: 24.02.2011
Сообщений: 16
По умолчанию

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
Вы не знаете, в чём проблема, но уже как-то определили, что её нет нигде, кроме вот этих вот пары строчек
Уверен был и пока еще уверен. Уверен потому что код, который идет до создания потоков TLifeOfItem, выполняется нормально без сбоев. Были бы сбои, то к добавлению программа даже не дошла бы, именно исходя из этого я и сделал выводы, что накосячил в создании/старте потока

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
Зато теперь, когда вы код привели, в последнем коде я вижу отсутствие синхронизации при доступе к pool, itemsInWork и, возможно, isWork (я не знаю точно, потому что код вы опять не привели).
pool - массив TLifeOfItem, объявлен в описании TNewThread, к этому массиву нигде нет обращений кроме как этих вот пары строчек. Какая для pool нужна синхронизация?

isWork - признак "запущенности" потока на обработку, объявлен в TNewThread. Потоки TLifeOfItem и поток TNewThread не меняют значения isWork, оно меняет значение только в одном месте, когда "пользователь нажмет СТОП"

itemsInWork - список id объявлений,объявлен в TLifeOfItem. Когда поток TNewThread запостил объявление и вырезал id, он пихает это id в itemsInWork. Потоки TLifeOfItem имеют доступ к itemsInWork но только через Synchronize - где поток перед тем как умирать вызывает метод удаления ID из работающих потоков. Но это удаление вызывается только через Synchronize. (но этот код в текущем примере нигде не вызывается, т.е. проблема тоже не в нем)

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
Мой выстрел наугад: из-за отсутствия синхронизации поток ловит Access Violation и самоэкстерминируется.
Я думаю, что он хоть гавкнуть об этом должен. Тем более где он может ловить Access Violation? В TLifeOfItem.Create нет, не ловит иначе вообще не запускался =). Дальше, isWork из TLifeOfItem.Execute убрал вообще - результат тот же. Потоки которые были созданы перед добавлением последнего "пропадают"

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
зачем задаёте вопрос?
Чтобы вы могли назвать меня вруном, могли попрактиковаться остроумии и тп. и тд. Спасибо большое.
nikol_ вне форума Ответить с цитированием
Старый 26.01.2012, 09:34   #14
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
pool - массив TLifeOfItem, объявлен в описании TNewThread, к этому массиву нигде нет обращений кроме как этих вот пары строчек. Какая для pool нужна синхронизация?
Над массивами есть( и были) многофункциональные обертки, придуманные, ещё в далеком 2002 году...
Вам пора узнать об TList,TObjectList,TCollection и т.д.

Цитата:
Я думаю, что он хоть гавкнуть об этом должен. Тем более где он может ловить Access Violation? В TLifeOfItem.Create нет, не ловит иначе вообще не запускался =). Дальше, isWork из TLifeOfItem.Execute убрал вообще - результат тот же. Потоки которые были созданы перед добавлением последнего "пропадают"
И зачем гавкать, когда можно, просто, посеять указатель на поток, и тупо создать не управляемый обьект в куче. Цитирую:
Цитата:
Потоки которые были созданы перед добавлением последнего "пропадают"

Последний раз редактировалось Человек_Борща; 26.01.2012 в 09:38.
Человек_Борща вне форума Ответить с цитированием
Старый 26.01.2012, 11:34   #15
nikol_
Пользователь
 
Регистрация: 24.02.2011
Сообщений: 16
По умолчанию

Человек_Борща, заменил код:
Код:
      am:=length(pool);  // узнаю сколько в массиве сейчас потоков
      setlength(pool,am+1); // выделяю место под НОВЫЙ поток
      pool[am]:=TLifeOfItem.Create(idNewItem,'Поток №' + IntToStr(am+1),IdCookieM); // создаю НОВЫЙ поток и пихаю его в массив.
      pool[am].Start; // запускаю НОВЫЙ созданный поток
На вот этот:
Код:
      am:=pool.Count;
      pool.Add(TLifeOfItem.Create(idNewItem,'Поток №' + IntToStr(am+1),IdCookieM));
      TLifeOfItem(pool[am]).Start;
На общую ситуацию изменения не повлияли никак...
Цитата:
[9:23:15] - Получение новой капчи
[9:23:15] - !1
[9:23:47] - Капча получена - uawhz7
[9:23:49] - Добавлен новый итем [404253]
Поток №1: [9:23:49] - Начата обработка итема - [404253]
Поток №1: [9:23:49] - Поток №1 обработка итема - [404253]
Поток №1: [9:23:50] - Поток №1 обработка итема - [404253]
[9:23:51] - Добавление нового итема
Поток №1: [9:23:51] - Поток №1 обработка итема - [404253]
[9:23:51] - Получение новой капчи
[9:23:51] - !1
Поток №1: [9:23:52] - Поток №1 обработка итема - [404253]
Поток №1: [9:23:53] - Поток №1 обработка итема - [404253]
Поток №1: [9:24:18] - Поток №1 обработка итема - [404253]
[9:24:18] - Капча получена - snb78r
Поток №1: [9:24:19] - Поток №1 обработка итема - [404253]
Поток №1: [9:24:20] - Поток №1 обработка итема - [404253]
[9:24:20] - Добавлен новый итем [404254]
Поток №2: [9:24:20] - Начата обработка итема - [404254]
Поток №2: [9:24:20] - Поток №2 обработка итема - [404254]
[9:24:22] - Добавление нового итема
Поток №2: [9:24:22] - Поток №2 обработка итема - [404254]
[9:24:23] - Получение новой капчи
[9:24:23] - !1
Поток №2: [9:24:23] - Поток №2 обработка итема - [404254]
Поток №2: [9:24:23] - Поток №2 обработка итема - [404254]
nikol_ вне форума Ответить с цитированием
Старый 26.01.2012, 11:46   #16
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

вы поражаете гениальностью..
Код:
      am:=pool.Count; //сколько есть ДО добавления нового обьекта
      //добавляем НОВЫЙ обьект
      pool.Add(TLifeOfItem.Create(idNewItem,'Поток №' + IntToStr(am+1),IdCookieM));
      //ЗАПУСКАЕМ старый поток ЗАНОГО, вместо того, который добавили... 
      TLifeOfItem(pool[am+1]).Start; //<< - ошибка ваша тут
по этому:
Код:
      am:=pool.Count-1; //сколько есть ДО добавления нового обьекта
      //добавляем НОВЫЙ обьект
      pool.Add(TLifeOfItem.Create(idNewItem,'Поток №' + IntToStr(am+1),IdCookieM));
      am:=pool.Count-1; //сколько есть ПОСЛЕ добавления нового обьекта      
//ЗАПУСКАЕМ старый поток ЗАНОГО, вместо того, который добавили... 
      TLifeOfItem(pool[am]).Start;
И управлением потокоми(Добовление, изменение, и т.д.) должен заниматься обьектный ПУЛ. Иначе это не Пул т.к. пративоречит этому ваш же код:
Код:
      pool.Add(TLifeOfItem.Create(idNewItem,'Поток №' + IntToStr(am+1),IdCookieM));
am:=pool.Count -1; //сколько есть ПОСЛЕ добавления нового обьекта      
//ЗАПУСКАЕМ старый поток ЗАНОГО, вместо того, который добавили... 
      TLifeOfItem(pool[am]).Start;
ваш ПУЛ тупо хранилище потоков, но ни как не ПУЛ потоков. Вы толкаете туда поток, и вы же его запускаете, а этим должен заниматься пул.

[UPD]
Поправил косяки.. Count возвращает количесво элементов включая 0 [0..4] = 5, а обращение к 5-ому элементу станет ERangeError т.к. 5-го элемента нет.

Последний раз редактировалось Человек_Борща; 26.01.2012 в 12:07.
Человек_Борща вне форума Ответить с цитированием
Старый 26.01.2012, 11:54   #17
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Человек_Борща с каких пор индекс последнего элемента совпадает с количеством элементов? К-во = 5, индекс от 0 до 4. Ваш пример сразу вывалит ошибку, поскольку выход за пределы. Кто поражает гениальностью ещё вопрос
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 26.01.2012, 12:02   #18
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Человек_Борща с каких пор индекс последнего элемента совпадает с количеством элементов? К-во = 5, индекс от 0 до 4. Ваш пример сразу вывалит ошибку, поскольку выход за пределы. Кто поражает гениальностью ещё вопрос
Tlist - массив указателей, новые элементы пихаются в конец.
Count - вернёт кол-во элементов включая 0-ль.
На момент добовления нового элемента, последний элемент будет = Count.

Или логика не верна? Или Tlist стал на столько не логичным?
или я опять бревно с домом попутал?

[upd]

Просёк фишку=) Опять бревно с домом спутал

Последний раз редактировалось Человек_Борща; 26.01.2012 в 12:08.
Человек_Борща вне форума Ответить с цитированием
Старый 26.01.2012, 12:07   #19
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Первый элемент - 0,
последний - Count-1
всего элементов - Count
Цитата:
На момент добовления нового элемента,
До добавления индекс следующнго добавляемого будет равен этому Count если его запомнить до добавления, что тоже самое что Count-1 после добавления
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 26.01.2012 в 12:11.
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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