Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Toshen
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 7
#1

ATL Service и переодическая задача - C++

18.07.2013, 09:08. Просмотров 865. Ответов 11
Метки нет (Все метки)

Необходимо написать сервис для вин, использую для этой цели шаблон в VS2010(С++, АТЛ).
Переопределяю события(при старте, паузе...) - всё ок. Реализую нужный функционал.

Как реализовать периодическое выполнение некоторого кода?
Если при старте делать бесконечный цикл, то сервис не запускается( видимо необходимо окончание метода пристарте). Пробовал сделать так:
C++
1
threadHandle = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc, this, 0, NULL);
но при старте сервиса он сразу же завершил свою работу.

Добавлено через 16 часов 49 минут
всё ещё актуально
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.07.2013, 09:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос ATL Service и переодическая задача (C++):

ATL - C++
Здравствуйте, не подскажете если ли туториалы на русском по этой библиотеке? Нужно написать службу

поделитесь ATL - C++
Доброго времени суток! Может у кого завалялась библиотека atl, будьте добры, поделитесь. на форум или файлообменик не принципиально. А...

Литература по ATL/WTL. - C++
Здравствуйте, уважаемые форумчане! Не могли бы вы посоветовать стоящую литературу по библиотекам ATL/WTL, желательно не метровой толщины.

Где искать DllMain в ATL 7.0? - C++
Может кто знает где искать DllMain в ATL 7.0 А то смотрю в глобальных функциях есть а когда пытаешься открыть программа выкидывает тебя...

ATL не ясно как добавить объект - C++
Здорова! Создал проект ATL dll. В книге написано: "После создания COM сервера можно добавлять в него COM классы. Для вызова мастера...

Не могу разобраться с написанием ActiveX в ATL - C++
Вопрос ко всем знатокам COM и ATL и не только! Создал ActiveX control c с помощью мастера. Добавил Connection Point с помощью...

11
Kukurudza
105 / 86 / 6
Регистрация: 29.08.2012
Сообщений: 539
18.07.2013, 11:37 #2
событие поставить не?
0
Убежденный
Ушел с форума
Эксперт С++
15697 / 7207 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
18.07.2013, 11:55 #3
Цитата Сообщение от Toshen Посмотреть сообщение
но при старте сервиса он сразу же завершил свою работу.
Покажите код ThreadFunc.
0
Toshen
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 7
18.07.2013, 14:31  [ТС] #4
Цитата Сообщение от Kukurudza Посмотреть сообщение
событие поставить не?
Если в событии ожидать завершения функции, которая выполняется в созданном потоке, сервис не стартанёт и сообщит "Служба не ответила на запрос своевременно".
Цитата Сообщение от Убежденный Посмотреть сообщение
Покажите код ThreadFunc.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
while(nextAction!=stop)
{
       //nextAction является статическим членом класса и имеет тип Actions (где typedef enum Actions{stop, run};)
    switch(nextAction){
    case stop:
        return 0;
        break;
    case run:
        //тут код, который должен выполняться периодически
        break;
    default:
        break;
    }
    Sleep(1000);
}
проще говоря бесконечный цикл, пока глобальная переменная не примет значение выхода.
0
Убежденный
Ушел с форума
Эксперт С++
15697 / 7207 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
18.07.2013, 14:39 #5
Так а где сама функция ThreadFunc ? Хочу посмотреть ее объявление.
0
Toshen
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 7
18.07.2013, 14:54  [ТС] #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class CAuditorModule : public ATL::CAtlServiceModuleT< CAuditorModule, IDS_SERVICENAME >
    {
public :
    DECLARE_LIBID(LIBID_AuditorLib)
    DECLARE_REGISTRY_APPID_RESOURCEID(IDR_AUDITOR, "{8C07C3E6-0617-4624-B2D9-A0BAEFAFA233}")
        HRESULT InitializeSecurity() throw()
    {
        return S_OK;
    }
    //события сервиса
    HRESULT Start(int nShowCmd) throw();
    HRESULT Run(int nShowCmd) throw();
    void OnContinue(void) throw();
    void OnPause(void) throw();
    void OnStop(void) throw();
    void OnShutdown(void) throw();
 
    
    static Actions nextAction;
    static HANDLE threadHandle;
    
private:
    static DWORD WINAPI ThreadFunc();
 
    //+прочие методы обработки данных
    };

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
HRESULT CAuditorModule::Start(int nShowCmd) throw()
{   
    try
    {
        nextAction = run;
        threadHandle = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc, this, 0, NULL);
    }catch(int e){
 
    }
 
    //return CAtlServiceModuleT< CAuditorModule, IDS_SERVICENAME >::Start (nShowCmd);
    return 0;
}
0
Убежденный
Ушел с форума
Эксперт С++
15697 / 7207 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
18.07.2013, 15:00 #7
Цитата Сообщение от Toshen Посмотреть сообщение
static DWORD WINAPI ThreadFunc();
Неправильная сигнатура.
Должно быть так:
C++
1
static DWORD WINAPI ThreadFunc(void *pParam);
0
Toshen
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 7
18.07.2013, 15:39  [ТС] #8
Проблему не решило
C++
1
2
3
4
5
6
7
8
HRESULT CAuditorModule::Start(int nShowCmd) throw()
{   
    nextAction = run;
    threadHandle = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc, this, 0, NULL);
    //WaitForSingleObject(threadHandle,INFINITE);
    
return CAtlServiceModuleT< CAuditorModule, IDS_SERVICENAME >::Start (nShowCmd);
}
если оставить так, поток будет создан и сраз же сервис завершён(вместе с удалением потока).
если раскоментировать //WaitForSingleObject(threadHandle,INFINITE);, сервис не стартует и выдаст ошибку.(при этом функция в потоке будет выполняться до снятия задачи в диспетчере)
0
Убежденный
Ушел с форума
Эксперт С++
15697 / 7207 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
18.07.2013, 15:53 #9
Вы поменяли сигнатуру ThreadFunc или нет ?
0
Toshen
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 7
18.07.2013, 16:03  [ТС] #10
да, изменил
0
Убежденный
Ушел с форума
Эксперт С++
15697 / 7207 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
18.07.2013, 16:18 #11
Ок. А как сервис регистрируется в системе ?
И как Вы его запускаете ?
Можете описать последовательность действий ?
0
Toshen
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 7
19.07.2013, 12:12  [ТС] #12
Регистрация: в консоле пишу Auditor.exe /Service
Запуск: в управлении компьютером открываю службы, выбираю из списка, запускаю

Добавлено через 6 минут
Выполнить некоторую задачу в сервисе могу(подставив её в событие при старте), но не пойму как сделать периодическую задачу.
При попытке использовать бесконечный цикл в событии при старте получаю ошибку.
При попытке сделать 2й поток и в нём выполнять цикл возникает проблема, что поток создаётся и сразу же после этого завершается.
Как сделать так, что бы "при старте" завершилось, но сервис продолжал работать пока существует 2й поток?

Добавлено через 18 часов 49 минут
up!
0
19.07.2013, 12:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.07.2013, 12:12
Привет! Вот еще темы с ответами:

В ATL нашел код: __interface - как это работает - C++
__interfase - структура не содержащая свойств! в ATL нашел такой вот код, и никак не пойму как это работает struct CStringData; ...

VC++6.0/ATL - ошибка сборки в режиме Release при исп.функций из math.h - C++
В проекте созданным ATL COM AppWizard обязательно без поддержки MFC при использовании функций, объявленных в math.h, например, sqrt(),...

Где скачать в электронном виде "ATL 8. Внутренняя структура и применение" - C++
Кто может помочь найти где скачать в электронном виде &quot;ATL 8. Внутренняя структура и применение&quot;. Нашел только на google book, но не...

A Windows service with the name MySQL already exists. Please uninstall this service correctly or choose a different name for the new service. - MySQL
Не знаю что делать дальше


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru