![]() |
|
|
![]()
|
|
| Валерия |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 10.3.2007 Репутация: нет Всего: 8 |
Опять вопрос
Вот такое зависает, т.к, насколько я поняла, нужна синхронизация потока с формой. Как её сделать? Для C++ примера не нашла, только для Делфи, но его не получается применить, изменив синтаксис... |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: нет Всего: 110 |
Валерия, вы запостили в узкоспециализированном разделе. тут мало кто вообще знает что такое boost и boost::thread в частности.
1. это лишнее. т.к. вы заставляете основной поток ждать завершения порожденного потока. т.е. из-за этого весь смысл потока теряется. 2. оставьте тело пустым, и отпишитесь о результате. |
|||
|
||||
| Валерия |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 10.3.2007 Репутация: нет Всего: 8 |
Было 2 потока, я вначале их создаю, а потом каждому делаю join - тогда они работают парралельно, а не последовательно Когда нажимаю на кнопку, то внизу пишет
|
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: нет Всего: 110 |
немного не так. join() нужен для того, чтоб синхронизировать завершение потока с вызываемым потоком. лично я очень редко использую этот метод. как по мне, он вообще лишний. т.к. если его использовать только для того чтоб убедится в том что поток завершился, тогда уж лучше выполнять в потоке функциональный объект, который вызовет некий хэндлер по завершении работы. это где? Это сообщение отредактировал(а) boostcoder - 25.11.2010, 17:04 |
|||
|
||||
| Валерия |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 10.3.2007 Репутация: нет Всего: 8 |
||||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: нет Всего: 110 |
сделайте тело таким:
проверьте что есть вывод в консоль, и прога не виснет. |
|||
|
||||
| Валерия |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 10.3.2007 Репутация: нет Всего: 8 |
||||
|
||||
| mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 167 Всего: 306 |
не надо нас оскорблять Валерия, мне искренне интересно чем Вас не устраивает собственный враппер VCL - TThread? тем более маловероятен тот факт, что boost::thread будет адекватнее TThread при работе с формами без дополнительных костылей. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 26 Всего: 459 |
Могу рассказать как это делает VCL-ский TThread. Он ждет до тех пор пока главный поток не войдет во внутренний обработчик OnIdle . Делается это следующим образом. Дополнительный поток пытается захватить сразу 2е критические секции. 1я свободна всегда (сигнальная). Захват ее будет для главного потока признаком того что имеются ожидающие исполнения действия. Но второй поток должен заблокироваться ожидая разрешения главного потока (синхронизирующая). Когда у главного потока нет работы, то он периодически заглядывает в свой OnIdle и проверят не занимал ли кто сигнальную критическую секцию. Если она занята, то он освобождает синхронизирующую критическую секцию на которой заблокирован дополнительный поток, а сам пытается занять сигнальную(которая занята). Т.о. главный поток засыпает ожидая, пока дополнительный не закончит свои действия и не освободит сигнальную критическую секцию. Дополнительный поток закончил работу, теперь главный проснулся и должен снова заблокировать синхронизирующую критическую секцию, но не раньше чем отпустит сигнальную (думаю понятно почему). Внутренний обработчик OnIdle нам не доступен, но зато доступен Application.OnIdle, который вызывается примерно с такой же частотой как и внутренний. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Валерия |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 10.3.2007 Репутация: нет Всего: 8 |
Почему там где я юзаю стандартный компонент - мне советуют юзать boost.
А там где разобралась с бустом - советуют юзать стандартное? |
|||
|
||||
| mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 167 Всего: 306 |
||||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 26 Всего: 459 |
Неправда! boost::regex более стандартный чем кустарный TRegExp . Просто VCL удобнее всего использовать вместе с классами VCL чем с любыми другими. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Пытался срубить дерево, топором. Мне сказали - возьми бензопилу и не мучайся. Взял, спилил за 5 минут, и получил спиленным деревом по башке Вывод - какая сволочь посоветовала брать бензопилу!? Нужны thread'ы - или используйте boost::thread и не лезьте из них в VCL (ну не предназначен VCL для такой работы), или используйте то, что предназначенно (TThread) |
|||
|
||||
| Alca |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 25 Всего: 50 |
Ну можно лазить с помощью ::PostMessage или ::SendMessage и тогда будет все равно какие враперы использовать |
|||
|
||||
| mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 167 Всего: 306 |
||||
|
||||
| Alca |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 25 Всего: 50 |
Зато гуй не будет лочиться |
||||
|
|||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 26 Всего: 459 |
SendMessage точно также залочит как и Synchronize, а вместо PostMessage в новых версиях есть TThread.Queue , который выполнит операцию асинхронно. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Валерия |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 10.3.2007 Репутация: нет Всего: 8 |
Уговорили.
Сделала всё на TThread. Синхронайз работает нормально, форма не виснет Всем спасибо Это сообщение отредактировал(а) Валерия - 26.11.2010, 14:06 |
|||
|
||||
![]()
|
| Правила форума "С++ 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. |