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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.06.2007, 22:00   #1
kdv0403
Новичок
Джуниор
 
Регистрация: 08.06.2007
Сообщений: 1
По умолчанию Дескрипторы потоков - Для каждого элемента списка необходимо создать поток, выполняющий требуемые функции

Добрый день,
помогите разобраться с проблемкой:
имеется список, хранящийся в ListView. Для каждого элемента списка необходимо создать поток, выполняющий требуемые функции. Должна быть возможность прервать выполнение потока.
Проблема в том, что для этого необходимо хранить дескрипторы потоков привязанными к элементам списка. Для этого решил использовать указатель Data типа Pointer компонента ListItem (ListView.ListItem.Data). Код следующий:
Код:
type
  TfmMain = class(TForm)
    ... 
    lvServers: TListView;
    ... 
  end;
procedure TfmMain.buStartClick(Sender: TObject);
var
  P: ^TExecuterThread;
begin
  new(P);
...
  P^ := TExecuterThread.Create(false, lvServers.Selected);
  lvServers.Selected.Data := P;
...
end;
...
procedure TfmMain.buStopClick(Sender: TObject);
var
  i: integer;
  P: ^TExecuterThread;
begin
  with lvServers.Items do
    for i := 0 to Count do
      if (Item[i].Selected) and isAlreadyStarted(Item[i]) then
      begin
        try
          P := Item[i].Data;
          P^.Terminate;
          dispose(P);
        except
        end;
      end;
end;
Здесь TExecuterThread - потомок класса TThread.
Во время выполнения программы при прерывании потока (P^.Terminate) появляется ошибка типа "Access violation ...", но поток все же прерывается. Ошибка эта выскакивает и не в среде Делфи (при запуске экзешника), то есть блок try...except здесь не помогает.
Это последний элемент функциональности, но застрял на нем.
Подскажите, пожалуйста, как избавиться от ошибки.
Заранее благодарю
kdv0403 вне форума Ответить с цитированием
Старый 09.06.2007, 07:49   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

вместо dispose(P); попробуй P^.Free;
pu4koff вне форума Ответить с цитированием
Старый 09.06.2007, 11:12   #3
Rouse_
Пользователь
 
Аватар для Rouse_
 
Регистрация: 31.05.2007
Сообщений: 56
По умолчанию

Выстави у потока FreeOnTerminate := True и достаточно будет ему сказать только P^.Terminate; Все остальное он сделает сам
Vae Victis
(Горе побежденным (лат.))
Демки с открытым кодом:
http://rouse.drkb.ru
Rouse_ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать отдельный поток для отправки письма betirsolt Работа с сетью в Delphi 2 28.12.2009 22:39
удаление элемента из списка aurora_87 Общие вопросы C/C++ 1 18.06.2009 14:02
Необходимо создать форму для регистрации на сайте Mirrra Фриланс 2 28.04.2009 15:28
Создать программу для вычисления значения функции. wertion Помощь студентам 2 27.11.2008 20:53