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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.01.2014, 19:44   #1
Winexcel
Форумчанин
 
Регистрация: 26.08.2013
Сообщений: 187
Сообщение Acess Violant при обрашении к публичной переменной в потоке.

Собственно использовал в своей программе два разных потока, один проверяет наличие валидности данных, которые пользователь вводит в соответсвующие поля, второй уже обрабатывает эти данные, но суть не в этом, я так и не понимаю почему, но тот поток который создаётся от формы, это первый, которые проверяет данные на валид, не может получить эту самую переменную, поясню немного программно:

Код:
    authuser:array of TAuthUser; //1 поток проверка на валид
    workbot:array of tworkbot; //2 поток обработка данных
Собственно запускаю первый поток так:

Код:
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);
 authuser[i].FreeOnTerminate:=true;
 authuser[i].N:=I; //Та самая переменная которая меня замучала :d
 authuser[i].Resume;
Собственно переменная N, это публичная переменная
Код:
public
    N:integer;
В самом потоке, я пытаючь её получить и использовать чтобы обрабатывать данные и выводить их в ListView, но при следующем подходе я получаю ошибку:
Код:
akklog:=AuthUser[N].N;
следующего вида:


Если же использовать код так:
Код:
akklog:=N;
То всё работает на ура, ах да забыл, для уточнения:
Код:
procedure TAuthUser.Execute;
var
akklog:integer;
Вот так обстоит дело с этим потоком, но почему я пишу эту тему тут если я её решил? А потому и пишу что в другом потоке следующий подход работает на ура, только почему , немного кода, данный поток workbot запускается если выполнились какие либо условия из потока authuser:

Код:
//çàïóñêàåì ïîòîê
setlength(workbot, form1.sListView1.Items.Count-1);
workbot[akklog]:=tworkbot.Create(true);
workbot[akklog].N2:=akklog;
workbot[akklog].FreeOnTerminate:=true;
workbot[akklog].Resume;
В потоке workbot, переменная N2 публичная, получаю номер потока, и уже редактирую таблицу без каких либо проблем.

Код:
numakk:=workbot[N2].N2;
Почему так?

Последний раз редактировалось Winexcel; 19.01.2014 в 19:46.
Winexcel вне форума Ответить с цитированием
Старый 19.01.2014, 19:58   #2
doktor255
Заблокирован
 
Регистрация: 31.03.2011
Сообщений: 976
По умолчанию

Представь что обе половинки твоего головного мозга, это отдельные потоки, которые работают полностью независимо, а твоя переменная это левая нога. Одна половинка мозга (один поток), подаёт твоей ноге(переменной) команду оторваться от земли, и в то же самое время вторая половина мозга (второй поток) подаёт команду твоей ноге (переменной) поставить ногу. А теперь вопрос. Сколько ты сможешь пройти?
doktor255 вне форума Ответить с цитированием
Старый 19.01.2014, 20:32   #3
Winexcel
Форумчанин
 
Регистрация: 26.08.2013
Сообщений: 187
По умолчанию

Цитата:
Сообщение от doktor255 Посмотреть сообщение
Представь что обе половинки твоего головного мозга, это отдельные потоки, которые работают полностью независимо, а твоя переменная это левая нога. Одна половинка мозга (один поток), подаёт твоей ноге(переменной) команду оторваться от земли, и в то же самое время вторая половина мозга (второй поток) подаёт команду твоей ноге (переменной) поставить ногу. А теперь вопрос. Сколько ты сможешь пройти?
У каждого потока своя переменная. Что-то ты путаешь.
Winexcel вне форума Ответить с цитированием
Старый 19.01.2014, 20:39   #4
doktor255
Заблокирован
 
Регистрация: 31.03.2011
Сообщений: 976
По умолчанию

Вот и скажи это среде разработки. Вдруг ответит.
doktor255 вне форума Ответить с цитированием
Старый 19.01.2014, 20:39   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я честно признаюсь - не понял ничего. Хотя дважды попытался вникнуть в то что у тебя происходит. Можешь попонятнее для вудпекеров объяснить ваццап у тебя происходит?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.01.2014, 20:51   #6
Winexcel
Форумчанин
 
Регистрация: 26.08.2013
Сообщений: 187
По умолчанию

Первая переменная N объявлена в 1м потоке, вторая п переменная N2 во втором. Обе переменные публичные. Когда я запускаю первый поток и пытаюсь получить значение через массив authuser[n].n то получаю ошибку что залил выше, этот первый поток запускается из формы по onclick button, но я смог получить лишь значение этого потока так akklog:=n, то есть значение из массива текущего потока(из самого себя), а из конкретного массива не могу, с потоком 2 же дело обстоит по другому, там я могу получить значение из публичной переменной n2 любого потока из массива tworkbot (не tauthuser). Также добавлю поток workbot запускается в самом конце потока authuser,если выполнились условия, и данная переменная(публичная) передаётся в публичную переменную этому потоку 2.

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


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как из метода X в потоке А, вызвать метод Y и чтобы он работал в потоке B ? lawliet93 C# (си шарп) 0 09.03.2013 18:16
Пауза при скачивании в потоке? fezilk25 Работа с сетью в Delphi 4 25.11.2011 11:48
Виджет для публичной страницы ВКонтакте Lawilet HTML и CSS 0 16.10.2011 00:54
Оишбка в потоке при работе с ADO MyIE БД в Delphi 7 07.07.2011 23:14
Использование глобальной переменной в потоке Шульц Общие вопросы Delphi 12 18.03.2010 20:00