Поиск:

Ответ в темуСоздание новой темы Создание опроса
> boost::thread и синхронизация с формой 
V
    Опции темы
Валерия
Дата 25.11.2010, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Опять вопрос smile

Код

void mythread(void) {
    Form5->Edit1->Text = "1";
}

void __fastcall TForm5::Button1Click(TObject *Sender)
{
    boost::thread my_thread1(&mythread);
    
    my_thread1.join();
}

Вот такое зависает, т.к, насколько я поняла, нужна синхронизация потока с формой.
Как её сделать?
Для C++ примера не нашла, только для Делфи, но его не получается применить, изменив синтаксис...
PM MAIL   Вверх
boostcoder
Дата 25.11.2010, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Валерия, вы запостили в узкоспециализированном разделе. тут мало кто вообще знает что такое boost и boost::thread в частности.

1.
Цитата(Валерия @  25.11.2010,  16:05 Найти цитируемый пост)
my_thread1.join();

это лишнее. т.к. вы заставляете основной поток ждать завершения порожденного потока. т.е. из-за этого весь смысл потока теряется.
2.
Цитата(Валерия @  25.11.2010,  16:05 Найти цитируемый пост)
void mythread(void) {
    Form5->Edit1->Text = "1";
}

оставьте тело пустым, и отпишитесь о результате.

PM WWW   Вверх
Валерия
Дата 25.11.2010, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(boostcoder @  25.11.2010,  16:47 Найти цитируемый пост)
это лишнее. т.к. вы заставляете основной поток ждать завершения порожденного потока. т.е. из-за этого весь смысл потока теряется.

Было 2 потока, я вначале их создаю, а потом каждому делаю join - тогда они работают парралельно, а не последовательно


Цитата(boostcoder @  25.11.2010,  16:47 Найти цитируемый пост)
оставьте тело пустым, и отпишитесь о результате.

Когда нажимаю на кнопку, то внизу пишет 
Код

Thread Start: Thread ID: 4060. Process Project2.exe (1560)
Thread Exit: Thread ID: 4060. Process Project2.exe (1560)

PM MAIL   Вверх
boostcoder
Дата 25.11.2010, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(Валерия @  25.11.2010,  16:55 Найти цитируемый пост)
потом каждому делаю join - тогда они работают парралельно, а не последовательно

немного не так.
join() нужен для того, чтоб синхронизировать завершение потока с вызываемым потоком. лично я очень редко использую этот метод. как по мне, он вообще лишний. т.к. если его использовать только для того чтоб убедится в том что поток завершился, тогда уж лучше выполнять в потоке функциональный объект, который вызовет некий хэндлер по завершении работы.

Цитата(Валерия @  25.11.2010,  16:55 Найти цитируемый пост)
внизу пишет 

это где? smile 

Это сообщение отредактировал(а) boostcoder - 25.11.2010, 17:04
PM WWW   Вверх
Валерия
Дата 25.11.2010, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(boostcoder @  25.11.2010,  17:04 Найти цитируемый пост)
это где? smile 

Event log
PM MAIL   Вверх
boostcoder
Дата 25.11.2010, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(Валерия @  25.11.2010,  16:55 Найти цитируемый пост)
Когда нажимаю на кнопку, то внизу пишет 

сделайте тело таким:
Код

void mythread(void) {
   std::cout << "from thread" << std::endl;
}

проверьте что есть вывод в консоль, и прога не виснет.
PM WWW   Вверх
Валерия
Дата 25.11.2010, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(boostcoder @  25.11.2010,  17:16 Найти цитируемый пост)
проверьте что есть вывод в консоль, и прога не виснет. 

Я уже делала такое, даже в 2 потока, работало отлично и главное - парралельно (сделала в каждом потоке while(1){cout << "test\n"; Sleep(1000);} )

У меня проблема только с доступом к форме smile
PM MAIL   Вверх
mrbrooks
Дата 26.11.2010, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Цитата(boostcoder @  25.11.2010,  16:47 Найти цитируемый пост)
вы запостили в узкоспециализированном разделе. тут мало кто вообще знает что такое boost и boost::thread в частности.

не надо нас оскорблять  smile 

Валерия, мне искренне интересно чем Вас не устраивает собственный враппер VCL - TThread? тем более маловероятен тот факт, что boost::thread будет адекватнее TThread при работе с формами без дополнительных костылей.
PM MAIL   Вверх
Alexeis
Дата 26.11.2010, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(Валерия @  25.11.2010,  17:05 Найти цитируемый пост)
Вот такое зависает, т.к, насколько я поняла, нужна синхронизация потока с формой.
Как её сделать?

  Могу рассказать как это делает VCL-ский TThread. Он ждет до тех пор пока главный поток не войдет во внутренний обработчик OnIdle . Делается это следующим образом. Дополнительный поток пытается захватить сразу 2е критические секции. 1я свободна всегда (сигнальная). Захват ее будет для главного потока признаком того что имеются ожидающие исполнения действия. Но второй поток должен заблокироваться ожидая разрешения главного потока (синхронизирующая). Когда у главного потока нет работы, то он периодически заглядывает в свой OnIdle и проверят не занимал ли кто сигнальную критическую секцию. Если она занята, то он освобождает синхронизирующую критическую секцию на которой заблокирован дополнительный поток, а сам пытается занять сигнальную(которая занята). Т.о. главный поток засыпает ожидая, пока дополнительный не закончит свои действия и не освободит сигнальную критическую секцию. Дополнительный поток закончил работу, теперь главный проснулся и должен снова заблокировать синхронизирующую критическую секцию, но не раньше чем отпустит сигнальную (думаю понятно почему).
  Внутренний обработчик OnIdle нам не доступен, но зато доступен Application.OnIdle, который вызывается примерно с такой же частотой как и внутренний.  


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Валерия
Дата 26.11.2010, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Почему там где я юзаю стандартный компонент - мне советуют юзать boost.
А там где разобралась с бустом - советуют юзать стандартное?  smile 
PM MAIL   Вверх
mrbrooks
Дата 26.11.2010, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Цитата(Валерия @  26.11.2010,  10:57 Найти цитируемый пост)
Почему там где я юзаю стандартный компонент - мне советуют юзать boost.
А там где разобралась с бустом - советуют юзать стандартное?

если есть родной враппер, то лучше использовать его, если нет - прикручивает стороннюю библу. тем паче речь о потоках и гуе. 
PM MAIL   Вверх
Alexeis
Дата 26.11.2010, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(Валерия @  26.11.2010,  11:57 Найти цитируемый пост)
Почему там где я юзаю стандартный компонент - мне советуют юзать boost.

  Неправда! boost::regex более стандартный чем кустарный TRegExp . Просто VCL удобнее всего использовать вместе с классами VCL чем с любыми другими. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
xvr
Дата 26.11.2010, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Валерия @ 26.11.2010,  10:57)
Почему там где я юзаю стандартный компонент - мне советуют юзать boost.
А там где разобралась с бустом - советуют юзать стандартное?  smile

Пытался срубить дерево, топором. Мне сказали - возьми бензопилу и не мучайся. Взял, спилил за 5 минут, и получил спиленным деревом по башке  smile 
Вывод - какая сволочь посоветовала брать бензопилу!?

Нужны thread'ы - или используйте boost::thread и не лезьте из них в VCL (ну не предназначен VCL для такой работы), или используйте то, что предназначенно (TThread)

PM MAIL   Вверх
Alca
Дата 26.11.2010, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

Нужны thread'ы - или используйте boost::thread и не лезьте из них в VCL (ну не предназначен VCL для такой работы), или используйте то, что предназначенно (TThread)

Ну можно лазить с помощью ::PostMessage или ::SendMessage и тогда будет все равно какие враперы использовать


--------------------
PM WWW ICQ Skype Jabber   Вверх
mrbrooks
Дата 26.11.2010, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Цитата(Alca @  26.11.2010,  13:30 Найти цитируемый пост)
Ну можно лазить с помощью ::PostMessage или ::SendMessage и тогда будет все равно какие враперы использовать 

чет смахивает на аццкий костыль.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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