Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 7
1

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

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

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

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

Добавлено через 16 часов 49 минут
всё ещё актуально
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.07.2013, 09:08
Ответы с готовыми решениями:

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

Переодическая реклама в Хроме
Добрый день, Уважаемые! Прошу помочь решить проблему с постоянно выскакивающей рекламой в Хроме....

Переодическая выборка через JS
Вот к примеру есть такой не сложный код function mode() { $('#display').load('qwer.php');...

Переодическая очистка многих TextBox
помогите плиз....есть куча TextBox (более 100), их переодически нуна все очистить... все прошарил...

11
106 / 87 / 13
Регистрация: 29.08.2012
Сообщений: 539
18.07.2013, 11:37 2
событие поставить не?
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
18.07.2013, 11:55 3
Цитата Сообщение от Toshen Посмотреть сообщение
но при старте сервиса он сразу же завершил свою работу.
Покажите код ThreadFunc.
0
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
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
18.07.2013, 14:39 5
Так а где сама функция ThreadFunc ? Хочу посмотреть ее объявление.
0
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
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
18.07.2013, 15:00 7
Цитата Сообщение от Toshen Посмотреть сообщение
static DWORD WINAPI ThreadFunc();
Неправильная сигнатура.
Должно быть так:
C++
1
static DWORD WINAPI ThreadFunc(void *pParam);
0
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
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
18.07.2013, 15:53 9
Вы поменяли сигнатуру ThreadFunc или нет ?
0
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 7
18.07.2013, 16:03  [ТС] 10
да, изменил
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
18.07.2013, 16:18 11
Ок. А как сервис регистрируется в системе ?
И как Вы его запускаете ?
Можете описать последовательность действий ?
0
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.07.2013, 12:12
Помогаю со студенческими работами здесь

Переодическая ошибка при выполнении агента
Всем доброго дня. Есть несколько агентов, запукаемых по рассписанию 1 раз в день. Иногда,...

Олицетворение (impersonating) системных учетных записей (NETWORK SERVICE, LOCAL SERVICE и пр.)
Возникла необходимость олицетворения потоком произвольной учетной записи, в т.ч. и системной....

The Lotus Domino Server Service Terminated With Service-specific Error
Может быть встречались с такой проблемой? The Lotus Domino Server Service Terminated With...

Сервер не заходит с никакой учётные запись кроме Administrator (The User Profile Service service failed)
Вчера мои сервер стала жертва вымогателей после этого сейчас сервер не заходит с никакой учётные...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru