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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.02.2014, 12:28   #1
Winexcel
Форумчанин
 
Регистрация: 26.08.2013
Сообщений: 187
Печаль Чтение публичной переменной из потока.

Собственно такая проблема, создаю поток следующим образом:

Код:
for i:=0 to form1.sListView1.Items.Count-2 do begin
 setlength(WorkBot, i+1);
 inc(numpotok);
 WorkBot[i]:=TWorkBot.Create(true);
 WorkBot[i].FreeOnTerminate:=true;
 WorkBot[i].N2:=I;
 WorkBot[i].Resume;
end;
В procedure TWorkBot.Execute; пытаюсь получить публичную переменную N2 так:
Код:
NumThreads:=WorkBot[N2].N2; - Выходит ошибка:


Если выполнить код таким образом:
Код:
NumThreads:=N2;
То работает, почему так? Почему я не могу получить эту переменную из любого существующего массива?
Winexcel вне форума Ответить с цитированием
Старый 02.02.2014, 12:53   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Выставьте в настройках компилятора галочку RangeCheck - там видно будет, если это связано с неправильными индексами, т.к. очень на то похоже. Тем более Вы показываете код создания, а не код вызова (кроме одной строки). Возможно, как обычно локальная переменная не инициализирована.
phomm вне форума Ответить с цитированием
Старый 02.02.2014, 13:05   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
NumThreads:=WorkBot[N2].N2; - Выходит ошибка:
На этот момент и потока уже может не быть как такового. Когда FreeOnTerminate=True вообще из вне к нему нельзя обращаться
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 02.02.2014, 13:07   #4
Winexcel
Форумчанин
 
Регистрация: 26.08.2013
Сообщений: 187
По умолчанию

Цитата:
Сообщение от phomm Посмотреть сообщение
Выставьте в настройках компилятора галочку RangeCheck - там видно будет, если это связано с неправильными индексами, т.к. очень на то похоже. Тем более Вы показываете код создания, а не код вызова (кроме одной строки). Возможно, как обычно локальная переменная не инициализирована.
Да, видимо не правильный индекс:


Вот код:
Код:
procedure TWorkBot.Execute;
var
Numthread:integer;
begin
NumThread:=WorkBot[N2].N2;
end;
Переменная N2 публично объявлена в TWorkBot.

Код:
  public
   N2:integer;
Как исправить?
Winexcel вне форума Ответить с цитированием
Старый 02.02.2014, 13:09   #5
Winexcel
Форумчанин
 
Регистрация: 26.08.2013
Сообщений: 187
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Код:
NumThreads:=WorkBot[N2].N2; - Выходит ошибка:
На этот момент и потока уже может не быть как такового. Когда FreeOnTerminate=True вообще из вне к нему нельзя обращаться
Это понятно, я при самом запуске потока это сделать не могу вот в чём проблема. А если поток завершится, массив станет на 1 меньше я вас правильно понял? Но в данном случае поток не завершается и сушествует во время выполнения кода.
Winexcel вне форума Ответить с цитированием
Старый 02.02.2014, 13:18   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
NumThread:=WorkBot[N2].N2;
Вы из потока обращаетесь к внешнему массиву - а синхронизацию кто будет делать
Цитата:
А если поток завершится, массив станет на 1 меньше
С чего вдруг он станет на 1 меньше? Просто соответствующий указатель из массива будет ссылаться в никуда
Цитата:
Это понятно, я при самом запуске потока это сделать не могу вот в чём проблема
Ну если понятно, то не делайте так. Меняйте алгоритм
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 02.02.2014 в 13:24.
Аватар вне форума Ответить с цитированием
Старый 02.02.2014, 13:27   #7
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

никак понять не могу, зачем это все? N2 и так есть, зачем к ней еще через не пойми как стучать..
eval вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Acess Violant при обрашении к публичной переменной в потоке. Winexcel Общие вопросы Delphi 5 19.01.2014 20:51
получить значение переменной из потока winhttp Общие вопросы Delphi 1 29.08.2012 00:37
Многопоточность. Безопасный доступ к переменной/функции из потока. Lime Общие вопросы Delphi 17 21.10.2011 18:39