Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамическое создание потоков 
:(
    Опции темы
ProgMaster
  Дата 19.6.2006, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 24.1.2006
Где: Estonia

Репутация: нет
Всего: нет



Вот код основной программы:
Код

MyThread *th[100];
int iCurTh = 0;
    for(int i = 0; i < iTotal; i++)
    {
        log("\tStarting thread " + IntToStr(i + 1));
        iCurTh++;
        lRunning->Caption = IntToStr(iCurTh); // показывает сколько потоков включено
        // [Creating thread]
        th[i] = new MyThread(false);
        th[i]->FreeOnTerminate = true;
        // [/Creating thread]
    }


Далее поток:
Код

int iThreadNumber = 0; // глобальная переменная
//...
void __fastcall MyThread::Execute()
{
    iThreadNumber = StrToInt(fMain->lRunning->Caption);
    ShowMessage(IntToStr(iThreadNumber));
}


В чем проблема ? А она в том, что если меняется был поток с iThreadNumber=1, а после создался новый поток, то в первом потоке iThreadNumber стала равна той же iThreadNumber что и во втором потоке, т.е. 2....Почему так происходит ??? 
PM MAIL ICQ   Вверх
Fazil6
Дата 19.6.2006, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 11
Всего: 60



Цитата

 а после создался новый поток, то в первом потоке iThreadNumber стала равна той же iThreadNumber что и во втором потоке, т.е. 2....Почему так происходит ??? 

а почему должно быть подругому? 
Ты же сам написал, что переменная глобальная. Как по твоему она может остаться равной 1, если ты присваиваешь ей 2?
Никакие дополнительные экземпляры переменных в потоках не создаются. Сколько бы у тебя потоков небыло, переменная у тебя одна на все эти потоки и изменение ее в одном потоке видно во всех остальных.
PS Синхронизация... 
PM MAIL   Вверх
ProgMaster
Дата 20.6.2006, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 24.1.2006
Где: Estonia

Репутация: нет
Всего: нет



Если бы внимательно читал, то увидел бы, что iThreadNumber глобальна только для модуля потока(thread.cpp). И значение ей присваивается только в Execute один раз (из Label'a на главной форме)....

Т.е. Label'y при запуске (см код) первого потока присваивается 1, соответственно в первом потоке переменная iThreadNumber берет это значение, т.е. становится =1...Дальше она не меняется...
 
  Запускается второй поток, Label'y присваивается 2, во втором потоке уже iThreadNumber=2.

Она не общая ведь для всех потоков, а в каждом потоке своя....Почему же получается так, что она считается общей для всех и меняется в каждом ????

ЗЫ: Может есть способ в поток билдеровский TThread передать какое-то значение ??? (но опять таки, нужно чтобы у каждого потока была своя переменная, а не считалась за одну). 
PM MAIL ICQ   Вверх
Fazil6
Дата 20.6.2006, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 11
Всего: 60



Цитата

Если бы внимательно читал, то увидел бы, что iThreadNumber глобальна только для модуля потока(thread.cpp).

хм. А для других модулей она какая? Ты не правильно себе представляешь суть. А суть в том, что  глобальная переменная на то и глобальная, что для всех экземпляров твоего класса потока она одна единственная и неповторимая. Для того чтбы для каждого потока она была своя, она должна быть членом этого класса потока.
Цитата

Она не общая ведь для всех потоков, а в каждом потоке своя....Почему же получается так, что она считается общей для всех и меняется в каждом ????

неа, она общая  smile 
 
PM MAIL   Вверх
dumb
Дата 20.6.2006, 02:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 32
Всего: 158



ProgMaster, тебе нужно много читать и думать для реализации задуманного.

мало того, что принципов хранения данных не особо разумеешь, так еще и с синхронизацией не знаком, судя по всему.

ты считаешь что твой цикл создания потоков будет на каждой итерации курить и ждать, пока поток не начнет выполняться и не занесет в свою переменную номер итерации?

читать, читать, и еще раз читать. smile

ps. в потоках для нумерации лейблы всякие лучше не использовать. юзать надо, например, глобальную переменную-счетчик, причем, по-хорошему, с каким-либо синхронизирующим объектом для эксклюзивности доступа к ней. 
PM MAIL   Вверх
ProgMaster
Дата 20.6.2006, 03:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 24.1.2006
Где: Estonia

Репутация: нет
Всего: нет



Да лоханулся просто....Чет как-то посчитал что если я сделаю её глобальной для модуля то везде она разная будет ;).

dumb, почему же ?? Если все синхронизовать (что сделал я, правда нехило помудившись smile), то все будет работать без проблем. 
PM MAIL ICQ   Вверх
dumb
Дата 20.6.2006, 03:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 32
Всего: 158



потому что не читал или читал мало.
есть подозрение, что, несмотря на немалый объем проведенных тобой работ нетривиального характера, результат не является до конца правильным. smile но это только подозрение, ибо сам результат ты не показал.

ps. даю наводку - mutex, event, critical section, Synchronize()... 
PM MAIL   Вверх
ProgMaster
Дата 20.6.2006, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 24.1.2006
Где: Estonia

Репутация: нет
Всего: нет



Ну да....я по твоему не додумался заюзать Synchronize ???? Что дает твое чтение ?? В общем счете ничего. Прочитал и забыл, особенно детали (а это они и есть). Куда гораздо важнее личный опыт. Т.к. с теорией далеко не уедешь.

 Ну что могу сказать...Действительно это только подозрение. Т.к. тестировал уже во всех позах, работает все стабильно. А если интересует код синхронизованного доступа к лейблу, то:

Код

void __fastcall Thread::GetLabel()
{
    iThreadNumber = StrToInt(Form1->Label1->Caption);
}
// execute()
// Synchronize(GetLabel)
 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0517 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.