![]() |
|
|
![]()
|
|
| ProgMaster |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 24.1.2006 Где: Estonia Репутация: нет Всего: нет |
Вот код основной программы:
Далее поток:
В чем проблема ? А она в том, что если меняется был поток с iThreadNumber=1, а после создался новый поток, то в первом потоке iThreadNumber стала равна той же iThreadNumber что и во втором потоке, т.е. 2....Почему так происходит ??? |
||||
|
|||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 11 Всего: 60 |
а почему должно быть подругому? Ты же сам написал, что переменная глобальная. Как по твоему она может остаться равной 1, если ты присваиваешь ей 2? Никакие дополнительные экземпляры переменных в потоках не создаются. Сколько бы у тебя потоков небыло, переменная у тебя одна на все эти потоки и изменение ее в одном потоке видно во всех остальных. PS Синхронизация... |
|||
|
||||
| ProgMaster |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 24.1.2006 Где: Estonia Репутация: нет Всего: нет |
Если бы внимательно читал, то увидел бы, что iThreadNumber глобальна только для модуля потока(thread.cpp). И значение ей присваивается только в Execute один раз (из Label'a на главной форме)....
Т.е. Label'y при запуске (см код) первого потока присваивается 1, соответственно в первом потоке переменная iThreadNumber берет это значение, т.е. становится =1...Дальше она не меняется... Запускается второй поток, Label'y присваивается 2, во втором потоке уже iThreadNumber=2. Она не общая ведь для всех потоков, а в каждом потоке своя....Почему же получается так, что она считается общей для всех и меняется в каждом ???? ЗЫ: Может есть способ в поток билдеровский TThread передать какое-то значение ??? (но опять таки, нужно чтобы у каждого потока была своя переменная, а не считалась за одну). |
|||
|
||||
| Fazil6 |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 11 Всего: 60 |
хм. А для других модулей она какая? Ты не правильно себе представляешь суть. А суть в том, что глобальная переменная на то и глобальная, что для всех экземпляров твоего класса потока она одна единственная и неповторимая. Для того чтбы для каждого потока она была своя, она должна быть членом этого класса потока.
неа, она общая |
||||
|
|||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 32 Всего: 158 |
ProgMaster, тебе нужно много читать и думать для реализации задуманного.
мало того, что принципов хранения данных не особо разумеешь, так еще и с синхронизацией не знаком, судя по всему. ты считаешь что твой цикл создания потоков будет на каждой итерации курить и ждать, пока поток не начнет выполняться и не занесет в свою переменную номер итерации? читать, читать, и еще раз читать. ps. в потоках для нумерации лейблы всякие лучше не использовать. юзать надо, например, глобальную переменную-счетчик, причем, по-хорошему, с каким-либо синхронизирующим объектом для эксклюзивности доступа к ней. |
|||
|
||||
| ProgMaster |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 24.1.2006 Где: Estonia Репутация: нет Всего: нет |
Да лоханулся просто....Чет как-то посчитал что если я сделаю её глобальной для модуля то везде она разная будет ;).
dumb, почему же ?? Если все синхронизовать (что сделал я, правда нехило помудившись |
|||
|
||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 32 Всего: 158 |
потому что не читал или читал мало.
есть подозрение, что, несмотря на немалый объем проведенных тобой работ нетривиального характера, результат не является до конца правильным. ps. даю наводку - mutex, event, critical section, Synchronize()... |
|||
|
||||
| ProgMaster |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 24.1.2006 Где: Estonia Репутация: нет Всего: нет |
Ну да....я по твоему не додумался заюзать Synchronize ???? Что дает твое чтение ?? В общем счете ничего. Прочитал и забыл, особенно детали (а это они и есть). Куда гораздо важнее личный опыт. Т.к. с теорией далеко не уедешь.
Ну что могу сказать...Действительно это только подозрение. Т.к. тестировал уже во всех позах, работает все стабильно. А если интересует код синхронизованного доступа к лейблу, то:
|
|||
|
||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |