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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.10.2013, 15:33   #1
Winexcel
Форумчанин
 
Регистрация: 26.08.2013
Сообщений: 187
По умолчанию Массив потоков, и как они очищаются

Возникла проблема, собственно описание проблемы:
Есть 10 аккаунтов в программе, пример

Вася Пупкин
Вася Пупкин2 и тд.
Каждый аккаунт чекаеться в потоке, поток создаю массивом
Код:
authuser:array of TAuthUser;
Код:
TAuthUser = class(TThread)
Запускается поток так от кнопки START:

Код:
for i:=0 to form1.sListView1.Items.Count-2 do begin
 setlength(AuthUser, i+1); 
 inc(numpotok);
 authuser[i]:=tauthuser.Create(true);
 authuser[i].FreeOnTerminate:=true;
 authuser[i].N:=I;
 authuser[i].Resume;
end;
После чека, я пытаюсь изменить данные этого аккаунта из таблицы ListView, после того как я изменил эти данные я проверяю, если нажата кнопка старт, и пользователь не хотел останавливать программу то после нажатия на кнопку изменить аккаунт:

Код:
if (vkadd.sButton1.Caption='Изменить.') and (work=true) then begin

 authuser[countlistview]:=tauthuser.Create(true);
 authuser[countlistview].FreeOnTerminate:=true;
 authuser[countlistview].N:=countlistview;
 authuser[countlistview].Resume;


end else
Мы запускаем заново поток с индексом этого аккаунта, где он дальше успешно чекаеться, но, после запуска потока с индексом этого аккаунта выходит вот что:


Я собственно хочу понять саму суть, видимо после завершения потока который запускается при нажатие кнопки старт, освобождается массив, и затем я уже пытаюсь обратиться к несуществующему потоку, если не так то посоветуйте что нужно сделать, помогло добавления следующего
Код:
setlength(AuthUser, countlistview+1);
Но в данном случае если будет аккаунтов 10 а я редактирую например 5 то в массиве останется 6 потоков и 4 пропадёт, и выйдет ошибка я так понимаю. Кто знает помогите.
Winexcel вне форума Ответить с цитированием
Старый 09.10.2013, 15:51   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

небольшой оффтоп...

я не по сути вопроса. я про другое
Цитата:
Код:
for i:=0 to form1.sListView1.Items.Count-2 do begin
 setlength(AuthUser, i+1); 
 inc(numpotok);
 authuser[i]:=tauthuser.Create(true);
 authuser[i].FreeOnTerminate:=true;
 authuser[i].N:=I;
 authuser[i].Resume;
end;
так делать НЕ НАДО.
если уж Вам известно заранее, сколько будет элементов в массиве, так выносите это за цикл и делайте SetLength 1 (ОДИН) раз.
примерно так:
Код:
setlength(authuser, form1.sListView1.Items.Count-1); 
for i:=0 to form1.sListView1.Items.Count-2 do begin
 inc(numpotok);
 authuser[i]:= TAuthUser.Create(true);
 ....
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.10.2013, 16:17   #3
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,926
По умолчанию

Массив сам собой очищаться (освобождаться) не умеет. Как у вас происходит завершение потоков? И может лучше заменить массив на список?
northener вне форума Ответить с цитированием
Старый 09.10.2013, 16:25   #4
Winexcel
Форумчанин
 
Регистрация: 26.08.2013
Сообщений: 187
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Массив сам собой очищаться (освобождаться) не умеет. Как у вас происходит завершение потоков? И может лучше заменить массив на список?
Заменить массив на список, можно пример?
Поток сам по себе завершается, я при создании потока устанавливаю у него свойство FreeOnTerminate:=True
Также добавлю, если вы подумали что поток где-то зависает или останавливается:
Поток завершает свою работу, в самом конце при завершении выполняется
Код:
dec(numpotok);
Эта переменная равна 0 если нет потоков, так и есть, когда поток завершился я пытаюсь изменить аккаунт.

Последний раз редактировалось Winexcel; 09.10.2013 в 16:28.
Winexcel вне форума Ответить с цитированием
Старый 09.10.2013, 16:27   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Массив поток - это не удобно, более того, его сложно контролировать.
Используйте э\для этого хотябы списки(TList). Более того, есть список потоков: TThreadList вот его и берите в оборот.
Человек_Борща вне форума Ответить с цитированием
Старый 09.10.2013, 16:43   #6
Winexcel
Форумчанин
 
Регистрация: 26.08.2013
Сообщений: 187
По умолчанию

Проблему я нашёл, но не знаю как решить, поток нормально запускается из главного окна, Form1 - В моём случае, я создал там процедуру

Код:
procedure TForm1.akkchange(Index: integer);
begin
 authuser[Index]:=tauthuser.Create(true);
 authuser[Index].FreeOnTerminate:=true;
 authuser[Index].N:=countlistview;
 authuser[Index].Resume;
end;
И вызываю эту процедуру из Form2, работает, но если код процедуры использовать в Form2, то выдаёт ошибку, в чём подвох? Сам модуль потока подключен в uses, и модуль главного окна unit1.

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Массив поток - это не удобно, более того, его сложно контролировать.
Используйте э\для этого хотябы списки(TList). Более того, есть список потоков: TThreadList вот его и берите в оборот.
Возьму на заметку, но в данное время переписывать пол программы не вариант =(, на это уйдёт как минимум 1 день.

Последний раз редактировалось Winexcel; 09.10.2013 в 16:46.
Winexcel вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Расскажите кто работал или работает, что конкретно оптимизаторы делают? Ol'ga Общие вопросы Web 13 26.04.2013 00:28
Не дать накапливаться N кол-ву потоков в критической секции. Массив. HSR Общие вопросы Delphi 7 15.11.2012 01:02
Компьютерный AI в играх. Боты - как они работают? Человек_Борща Общие вопросы по программированию, компьютерный форум 63 03.01.2012 23:13
Важные для системы файлы самостоятельно очищаются. dp127 Помощь студентам 2 06.09.2011 16:29
События и делегаты в C# как они работают _PROGRAMM_ Общие вопросы .NET 11 04.02.2010 06:44