![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
zemfir |
|
|||
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 21.12.2003 Репутация: нет Всего: нет |
Многопоточность, структура простой программы.
Задача (упрощённо) Основное время приложении висит на систрее ожидает наступление определённых временных моментов (шедуллер) или общается с пользователем посредством разных менюшек, формочек и т.п. Когда момент настаёт, приложение должно выполнять определённое действие, после этого опять ожидание. Все бы ничего, но нужна независимость от действий пользователя, т.е. если он вдруг откроет меню, или модальное окно, то все равно должен работать и шедуллер и выполняемая задача (если она есть). Я хотел уточнить, в первом приближении структура проги в плане потоков должна быть такая: -Основной поток (форма); -Поток шедуллера; -Поток выполнения задачи. ? Если так, то вопрос, поток выполнения задачи должен создавать шедуллер? (хотя, имхо, это не принципиально) С потоками общался, но они всегда были одноразовые, т.е. нажал кнопку, поток создался, отработал, отрубился. А тут получается, что постоянно должны быть запущено несколько потоков. Если принципиально, использую BCB или Delphi (еще не решил), планирую использовать стандартный TThread&VCL. |
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Имхо, всё что нужно сделать в таком случае:
- создать WinAPI-шное событие - создать поток шедулера и передать ему хендл события через параметр - в потоке шедулера сделать бесконечный цикл с ожиданием события (по типу worker thread) Вот пример:
- для генерации события (и вызова соответствующих действий в потоке) достаточно в любом месте вызвать ::PulseEvent(m_hEvent) P.S. Сорри за возможные неточности при описании класса и метода формы -- я не очень дружу с BCB. Это сообщение отредактировал(а) mr.DUDA - 21.12.2003, 20:24 -------------------- ![]() |
|||
|
||||
zemfir |
|
|||
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 21.12.2003 Репутация: нет Всего: нет |
Спасибо! вопрос: а для чего это делать через событие, ведь можно сделать через внутренюю переменную программы? ещё вопрос: а где-либо есть дока, которая описывает общие принципы построения многопоточных программ? Я поискал, но не нашёл ![]() |
|||
|
||||
Jcs |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 156 Регистрация: 1.10.2003 Репутация: нет Всего: нет |
Для синхронизации есть много всяких хреней (мьютексы, семафоры, события). Если поток один, то можно использовать и переменную (я раньше сам так делал), но встроенные объекты синхронизации более оптимизированы для многопоточной работы и, например, приложение с тремя потоками кроме основного синхронизацию делало лучше посредством встроенных объектов. В твоем случае, мне кажется, проще будет просто зарядить виндовский таймер на то значение, какое тебе нужно и ловить WM_TIMER в главном окне. Тогда и потоков не понадобится. Если все-таки будешь делать через потоки, то документация есть в MSDN:Platform SDK\Windows Base Service\DLL, Processes and Threads.
|
|||
|
||||
zemfir |
|
|||
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 21.12.2003 Репутация: нет Всего: нет |
Я так и сделал при проверке, но это не подошло, приходилось постоянно отдавать управление "основной программе", выполняемые действия завязаны на времянки, желательно, что бы задача особо не отвлекалась (работа с портом), а если на таймере, то лезут проблемы, все очень зависит от действий юзера. Да и не знаю я, на сколько это корректно, на таймер подсаживать большую работу при активной главной форме.
Доки прочитаю, надо только мсдн купить ![]() Спасибо! Это сообщение отредактировал(а) zemfir - 21.12.2003, 22:38 |
|||
|
||||
Ars |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 28.8.2003 Где: Московская обл. Репутация: 2 Всего: 2 |
Согласен с Jcs. В сформулированной задаче необязательно городить много потоков, а то и вообще обойтись двумя однопоточными приложениями: Если точность шедулера не должна быть лучше секунды, то раз в секунду, например, по сообщению от таймера проверяем время и при необходимости запускаем отдельный процесс по выполнению задачи. Это никак не будет тормозить пользовательский интерфейс. Если нужно получать информацию об окончании выполнения, то проверяем WaitForSingleObject для созданного процесса с нулевым временем в том же обработчике таймера.
-------------------- Есть многое на свете, друг Горацио, С чем очень долго можно прое..! |
|||
|
||||
zemfir |
|
|||
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 21.12.2003 Репутация: нет Всего: нет |
Спасибо! У меня встречный вопрос, интересно, а с точки зрения правильности программы: -главная форма, в ней таймер, -открыл модальное окно, -В главном окне таймер продолжает тикать и что-то выполняется. Это нормально? этот момент для меня не ясен, т.е. на сколько нормальна подобная ситуация с точки зрения винды и правильности программ для винды? |
|||
|
||||
Ars |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 28.8.2003 Где: Московская обл. Репутация: 2 Всего: 2 |
Пока модальное окно не закрыто, управление в вызывающюю функцию не возвращается. Соответственно, сообщения родительского окна не обрабатываются. Это, конечно, может стать помехой в работе шедулера, но решаемо. Во-первых, можно вытаскивать из очереди приложения и обрабатывать сообщения от таймера и во время работы модального окна, во-вторых, - не использовать модальные окна.
-------------------- Есть многое на свете, друг Горацио, С чем очень долго можно прое..! |
|||
|
||||
zemfir |
|
|||
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 21.12.2003 Репутация: нет Всего: нет |
Ars
Если брать VCL таймер в главной форме, то он будет работать и при открытом модальном окне и при этом будет выполняться его обработчик. Меня интересует на сколько это корректно. |
|||
|
||||
Ars |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 28.8.2003 Где: Московская обл. Репутация: 2 Всего: 2 |
А почему это некорректно? Если это работает, значит это корректно
![]() -------------------- Есть многое на свете, друг Горацио, С чем очень долго можно прое..! |
|||
|
||||
zemfir |
|
|||
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 21.12.2003 Репутация: нет Всего: нет |
ну не знаю ![]() а вдруг это потенциально может создать кучу глюков, не сразу, а за какое-то время? Вот пару дней прога проработает, и глюканёт, это же не есть гуд, а там поблизости тетенька сидит, увидит что прога зависла её инфаркт хватит. А если серьёзно, если что-то неправильно, но работает (пусть почти всегда), это может значительно увеличивать вероятность сбоя, а эту вероятность нужно уменьшать. В общем, буду дальше разбираться;) Спасибо! |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |