![]() |
|
![]() ![]() ![]() |
|
Лена |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 879 Регистрация: 16.8.2006 Репутация: 11 Всего: 11 |
Есть код перезапускающий службу и занимающий время.
Во время перезапука я хочу в отдельном потоке вывести доп.окно с компонентом Animate и индикатором на нем. Опыта в этом маловато. Начинаю так:
Теперь функция потока:
Как правильно оформить ThreadFunc? Чтобы во время перезапука службы отобразилось окно с Animate, а по окончании перезапука оно закрылось? Без потока индикатор у Animate замирает:
Это сообщение отредактировал(а) Лена - 11.10.2007, 12:51 |
||||||||
|
|||||||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 18 Всего: 154 |
Через CreateThread лучше не делать, CRT его не инициализирует правильно (нельзя будет использовать ф-яя CRT). Можно либо взять TThread из VCL (в главном меню New->ThreadUnit, будет создан шаблон - куда можно писать свой код), либо делать это через _beginthread. Если чисто по логике, то лучше вынести в поток перезапуск службы, с формами и компонентами всё-же лучше работать из основного потока.
|
|||
|
||||
Лена |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 879 Регистрация: 16.8.2006 Репутация: 11 Всего: 11 |
Тогда может так упростить? Form4->Show(); ThreadFunc();
Это сообщение отредактировал(а) Лена - 11.10.2007, 13:37 |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 18 Всего: 154 |
Что-то вроде этого, только вместо вызова ф-ии нужно запустить поток.
|
|||
|
||||
Лена |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 879 Регистрация: 16.8.2006 Репутация: 11 Всего: 11 |
Так?
|
||||
|
|||||
dumb |
|
||||||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 32 Всего: 158 |
![]() и где тут отдельный поток? ты просто вынесла кусок кода в процедуру. примерная схема действий: File - New - Other... Thread Object, потом помещаешь свои S.Stop,S.Start в метод Execute. ULenaThread.h
ULenaThread.cpp
а в основном коде:
ps. покажи на всякий случай заголовочный файл от класса управляющего сервисом(S). pss. кстати, тема пережевывалась уже раз сто - в поиске, думаю, все забито решениями этой проблемы... ![]() |
||||||
|
|||||||
Lazin |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 18 Всего: 154 |
Для создания потока в главном меню нужно выбрать File->New->Other
в появившемся окне выбрать Thread Object потом появится окошко в котором нужно указать имя объекта (по которому к потоку можно обращаться в программе) и имя потока (можно не указывать) в системе. Builder создаст шаблон модуля unit1.h
unit1.cpp
В метод Execute нужно добавить свой код
В конструктор нужно добавить FreeOnTerminate = true; потом запускать поток new ServiceRestartThread(false); после того как поток закончит работу он будет удален автоматически. |
||||||
|
|||||||
dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 32 Всего: 158 |
||||
|
||||
Лена |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 879 Регистрация: 16.8.2006 Репутация: 11 Всего: 11 |
dumb и Lazin, спасибо за помощь. Я пол года назад делала поток, блин за это время все забыла.
![]() Как все таки правльно проверить условие завершения? while (!thr->Terminated()) //? [C++ Error] main.cpp(1701): E2109 Not an allowed type |
|||
|
||||
dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 32 Всего: 158 |
ой. это ж пропертя... while (!thr->Terminated)
|
|||
|
||||
Лена |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 879 Регистрация: 16.8.2006 Репутация: 11 Всего: 11 |
||||
|
||||
Лена |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 879 Регистрация: 16.8.2006 Репутация: 11 Всего: 11 |
Может проверку надо как-то поставить в метод Execute() ?
|
|||
|
||||
dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 32 Всего: 158 |
этот Terminated крайне ограниченным оказался...
![]()
|
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 18 Всего: 154 |
Может использовать событие:
Добавлено через 2 минуты и 44 секунды Млин, не знал что есть свойство TThread::Handle, тогда так как dumb написал конечно лучше. |
|||
|
||||
Лена |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 879 Регистрация: 16.8.2006 Репутация: 11 Всего: 11 |
Ух, спасибо вроде ожило.
![]() Я вот такой вариант пробовала: bool potok=true; //глобальная
В коде:
Сначала показалось, что работает, а один раз выскочило исключение вызов чисто виртуальной функции. ![]() Сейчас почитаю, о параметрах WaitForSingleObject, а то не понятно. ![]() У меня служба не устнаовлена. Для проверки кода от dumb, я не много меняю метод:
Вижу что мой Animate работает. Правильно ли я имитирую перезапукс службы? Может для надежности сделать два потока? Один останавливает, другой запускает... Это сообщение отредактировал(а) Лена - 11.10.2007, 16:30 |
||||||
|
|||||||
dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 32 Всего: 158 |
распространенная ошибка при неверной работе с потоками.
как это было: в Execute переменной potok присвоилось false и сразу после этого выполнение треда было приостановлено(менеджером потоков) и управление пришло в основной поток, там ты поймала изменение potok, вышла из цикла и грохнула объект. через какое-то время(это все в течение миллисекунд происходит, не подумай, что долго) управление вернулось в твой поток, происходит выход из метода Execute и далее(в TThread) должны происходить завершающие действия с объектом потока(выставление разных свойств, вызов метода OnTerminate, если назначен, итд). но объект уже удален. опаньки. ![]() ![]() Добавлено через 1 минуту и 41 секунду
|
|||
|
||||
Лена |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 879 Регистрация: 16.8.2006 Репутация: 11 Всего: 11 |
Поставила службу. Обнаружилось не приятность, если строки:
S.Stop(); S.Start(); В методе Execute, то служба останавливается и не стратует. А если эти строки поставить в основной код, то все нормально и останавливается и запускается. Добавлено @ 16:42 Вот так? void __fastcall SOSThread::Execute() { S.Stop(); Sleep(1000); S.Start(); } Это сообщение отредактировал(а) Лена - 11.10.2007, 16:51 |
|||
|
||||
dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 32 Всего: 158 |
||||
|
||||
Лена |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 879 Регистрация: 16.8.2006 Репутация: 11 Всего: 11 |
||||
|
||||
dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 32 Всего: 158 |
ну вот и славненько. можно со спокойной совестью громогласно объявить по экстренной связи "все на перекур нах!"
![]() если от вендора, то все ок. а если еще сами "наворачивали" оболочку, то надо убедиться, что там нет никаких обращений к формам итд(VCL). |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++ Builder" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C++ Builder | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |