Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Toshen
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 7
18.07.2013, 09:08     ATL Service и переодическая задача #1
Необходимо написать сервис для вин, использую для этой цели шаблон в VS2010(С++, АТЛ).
Переопределяю события(при старте, паузе...) - всё ок. Реализую нужный функционал.

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

Добавлено через 16 часов 49 минут
всё ещё актуально
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.07.2013, 09:08     ATL Service и переодическая задача
Посмотрите здесь:

C++ VC++6.0/ATL - ошибка сборки в режиме Release при исп.функций из math.h
не могу разобраться с написанием ActiveX в ATL C++
C++ где искать DllMain в ATL 7.0
ATL C++
C++ В ATL нашел код: __interface - как это работает
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kukurudza
105 / 86 / 6
Регистрация: 29.08.2012
Сообщений: 539
18.07.2013, 11:37     ATL Service и переодическая задача #2
событие поставить не?
Убежденный
Системный программист
 Аватар для Убежденный
14200 / 6215 / 986
Регистрация: 02.05.2013
Сообщений: 10,363
Завершенные тесты: 1
18.07.2013, 11:55     ATL Service и переодическая задача #3
Цитата Сообщение от Toshen Посмотреть сообщение
но при старте сервиса он сразу же завершил свою работу.
Покажите код ThreadFunc.
Toshen
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 7
18.07.2013, 14:31  [ТС]     ATL Service и переодическая задача #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);
}
проще говоря бесконечный цикл, пока глобальная переменная не примет значение выхода.
Убежденный
Системный программист
 Аватар для Убежденный
14200 / 6215 / 986
Регистрация: 02.05.2013
Сообщений: 10,363
Завершенные тесты: 1
18.07.2013, 14:39     ATL Service и переодическая задача #5
Так а где сама функция ThreadFunc ? Хочу посмотреть ее объявление.
Toshen
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 7
18.07.2013, 14:54  [ТС]     ATL Service и переодическая задача #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;
}
Убежденный
Системный программист
 Аватар для Убежденный
14200 / 6215 / 986
Регистрация: 02.05.2013
Сообщений: 10,363
Завершенные тесты: 1
18.07.2013, 15:00     ATL Service и переодическая задача #7
Цитата Сообщение от Toshen Посмотреть сообщение
static DWORD WINAPI ThreadFunc();
Неправильная сигнатура.
Должно быть так:
C++
1
static DWORD WINAPI ThreadFunc(void *pParam);
Toshen
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 7
18.07.2013, 15:39  [ТС]     ATL Service и переодическая задача #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);, сервис не стартует и выдаст ошибку.(при этом функция в потоке будет выполняться до снятия задачи в диспетчере)
Убежденный
Системный программист
 Аватар для Убежденный
14200 / 6215 / 986
Регистрация: 02.05.2013
Сообщений: 10,363
Завершенные тесты: 1
18.07.2013, 15:53     ATL Service и переодическая задача #9
Вы поменяли сигнатуру ThreadFunc или нет ?
Toshen
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 7
18.07.2013, 16:03  [ТС]     ATL Service и переодическая задача #10
да, изменил
Убежденный
Системный программист
 Аватар для Убежденный
14200 / 6215 / 986
Регистрация: 02.05.2013
Сообщений: 10,363
Завершенные тесты: 1
18.07.2013, 16:18     ATL Service и переодическая задача #11
Ок. А как сервис регистрируется в системе ?
И как Вы его запускаете ?
Можете описать последовательность действий ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.07.2013, 12:12     ATL Service и переодическая задача
Еще ссылки по теме:

C++ ATL не ясно как добавить объект

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

Или воспользуйтесь поиском по форуму:
Toshen
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 7
19.07.2013, 12:12  [ТС]     ATL Service и переодическая задача #12
Регистрация: в консоле пишу Auditor.exe /Service
Запуск: в управлении компьютером открываю службы, выбираю из списка, запускаю

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

Добавлено через 18 часов 49 минут
up!
Yandex
Объявления
19.07.2013, 12:12     ATL Service и переодическая задача
Ответ Создать тему
Опции темы

Текущее время: 18:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru