Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
1 / 1 / 0
Регистрация: 20.09.2015
Сообщений: 69

Использование функции SetTimer для завершения процесса

23.02.2016, 19:09. Показов 1569. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Прошу помощи в использовании данной функции. Нужно применить ее так, чтобы она закрывала процесс (калькулятор) по истечении 10 секунд после запуска.
Вот код, который имеется (+волокна не в тему).

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#define _WIN32_WINNT 0x500 
#include <Windows.h> 
#include <stdio.h>
#include <string>
#include <iostream>
 
HANDLE hJob;
VOID *fiber[4];
 
using namespace std;
 
bool AddProcessToJob(LPTSTR buf, STARTUPINFO* startUpInfo, PROCESS_INFORMATION* processInfo)
{
    ZeroMemory(startUpInfo, sizeof(*startUpInfo));
    startUpInfo->cb = sizeof(*startUpInfo);
    ZeroMemory(processInfo, sizeof(*processInfo));
    if (!CreateProcess(NULL, buf, NULL, NULL, false, 0, NULL, NULL, startUpInfo, processInfo))
        return false;
    else
        AssignProcessToJobObject(hJob, processInfo->hProcess);
}
 
DWORD WINAPI Open(CONST LPVOID lpParam)
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    TCHAR tchBuffCalc[MAX_PATH + 1];
    LPTSTR systemDirectoryCalc = tchBuffCalc;
    JOBOBJECT_BASIC_LIMIT_INFORMATION jInfo;
    GetSystemDirectory(systemDirectoryCalc, MAX_PATH + 1);
    wsprintf(tchBuffCalc, TEXT("%s\\calc.exe"), systemDirectoryCalc);
    hJob = CreateJobObject(NULL, TEXT("MyJob"));
    LPTSTR bufferCalc;
    bufferCalc = tchBuffCalc;
    AddProcessToJob(bufferCalc, &si, &pi);
    return 0;
    //ExitThread(0);
}
 
void WINAPI Func1(LPVOID lp)
{
    printf(" 1 (2) ");
    Sleep(2000);
    SwitchToFiber(fiber[2]);
    printf(" 1 (3) ");
    Sleep(3000);
    SwitchToFiber(fiber[1]);
}
 
void WINAPI Func2(LPVOID lp)
{
    printf(" 2 (3) ");
    Sleep(3000);
    SwitchToFiber(fiber[3]);
}
 
void WINAPI Func3(LPVOID lp)
{
    printf(" 3 (2) ");
    Sleep(2000);
    SwitchToFiber(fiber[4]);
}
 
void WINAPI Func4(LPVOID lp)
{
    printf(" 4 (3) ");
    Sleep(3000);
    SwitchToFiber(fiber[5]);
}
 
void WINAPI Func5(LPVOID lp)
{
    printf(" 5 (2) ");
    Sleep(2000);
    SwitchToFiber(fiber[0]);
}
 
void main()
{
    setlocale(LC_ALL, "Russian");
    int currentThreadNumber = 0;
    HANDLE handles[5];
    HANDLE Mutexes[5];
    for (int i = 0; i < 5; i++)
        Mutexes[i] = CreateMutex(NULL, FALSE, NULL);
    
    cout << "1. Неограниченное кол-во запусков calc.exe" << endl;
    cout << "2. Волокна" << endl;
    cout << "3. Выход" << endl;
    
    int answer;
    while (true)
    {
        cin >> answer;
        switch (answer)
        {
        case 2:
            fiber[0] = CreateFiber(0, Func1, NULL);
            fiber[1] = CreateFiber(0, Func2, NULL);
            fiber[2] = CreateFiber(0, Func3, NULL);
            fiber[3] = CreateFiber(0, Func4, NULL);
            fiber[4] = CreateFiber(0, Func5, NULL);
            fiber[5] = ConvertThreadToFiber(NULL);
            SwitchToFiber(fiber[0]);
            break;
        case 1:
            handles[currentThreadNumber] = CreateThread(NULL, 0, &Open, Mutexes[currentThreadNumber], 0, NULL);
            break;
        case 3:
            for (int i = 0; i < currentThreadNumber; i++)
            {
                CloseHandle(handles[i]);
                CloseHandle(Mutexes[i]);
            }
            exit(0);
        default:
            break;
        }
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.02.2016, 19:09
Ответы с готовыми решениями:

BAT-файл для завершения процесса с таймаутом
Доброго времени. Кто может, подскажите. Необходимо создать БАТ-файл, для завершения какого либо процесса, с такими условиями: На экран...

Нужна команда для принудительного завершения процесса steam.exe
Итак.... Ух.. С чего бы даже начать.. Итак наверно многие знают что такое Steam? Неправдали? Я скачал несколько игр со стим клиента и тут...

Как дождаться завершения одного процесса для начала другого?
Имеется папка с подпапками разного уровня вложений и файлы в них Имеется батник (indexer.bat), который помещает в каждую папку список...

12
 Аватар для rao
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
24.02.2016, 19:17
Запускать не пробовал, но мне кажется написана фигня, потому что:
1) строка 35: из функции Open при вызове AddProcessToJob передаются указатели на локальные адреса, а никакой синхронизации нету.
2) строка 85: мьютексов наделал, а нигде они не используются
3)
Цитата Сообщение от Nickolas97 Посмотреть сообщение
Прошу помощи в использовании данной функции. Нужно применить ее так...
О какой конкретно функции речь? TerminateJobObject нигде не вызывается. Т.е. "применять" то нечего - надо переделывать.
0
1 / 1 / 0
Регистрация: 20.09.2015
Сообщений: 69
24.02.2016, 21:49  [ТС]
Все работает, несмотря на лишний текст. Название функции указано в заголовке темы.
0
 Аватар для rao
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
25.02.2016, 18:57
А, да, пока код глядел про название забыл.
Работать то работает, но при многопоточности так делать нельзя: когда нибудь все-таки нагнется.

Все запущенные калькуляторы добавляются в один job. А через 10 сек они все сразу закрыться должны или кажды индивидуально в зависимости от времени своего запуска?
0
1 / 1 / 0
Регистрация: 20.09.2015
Сообщений: 69
25.02.2016, 22:07  [ТС]
Каждый индивидуально желательно.
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
25.02.2016, 22:29
Для консоли никогда не юзал SetTimer.. (сам найдёш, яндекс сразу дал на запрос "C++ SetTimer console")
В Windows режиме в WM_CREATE устанавливаеш:
C++
1
2
SetTimer(hWnd,1,250,NULL);
        srand(time(NULL));
И незабудь KillTimer(1); в WM_DESTROY.
В обработке WM_TIMER уже делаеш то что надо.
(поидее если всё статично на 10 секундах, то вместо 250, ставиш свои 10сек в милисекундах, и на сообщении WM_TIMER просто убиваеш thread, наверное так)

Добавлено через 3 минуты
Мм, если несколько запущенных, то тогда не так... брать время старта калькулятора, и по WM_TIMER если 10 сек прошли - то убивать.
0
 Аватар для rao
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
26.02.2016, 19:24
Хм, интересно получилось: SetTimer можно запустить с калбеком, но без цикла обработки оконных сообщений он работать не будет. Поэтому, если дело происходит в консоли (у которой этого цикла нет), то придется либо запускать цикл GetMessage(...)/DispatchMessage(...), либо пользоваться функцией CreateTimerQueueTimer. Второй вариант мне показался проще. Предлагаю сделать так, добавить это:
C++
1
2
3
4
5
6
7
8
HANDLE hTimer;
 
void CALLBACK TimerProc(PVOID lpParameter, BOOLEAN TimerOrWaitFired)
{
    TerminateProcess( (HANDLE)lpParameter, 0);
    DeleteTimerQueueTimer(NULL, hTimer, NULL);
    hTimer = NULL;
}
и заменить строки 106-108 на:
C++
1
2
3
4
5
6
7
8
9
10
        case 1:
        {
            STARTUPINFO si = {0};
            si.cb = sizeof(si);
            PROCESS_INFORMATION pi = {0};
            TCHAR sProgramm[] = L"calc.exe";
            CreateProcess(NULL, (LPWSTR)&sProgramm, NULL, NULL, false, 0, NULL, NULL, &si, &pi);
            CreateTimerQueueTimer(&hTimer, NULL, (WAITORTIMERCALLBACK)TimerProc, pi.hProcess, 10000, 0, WT_EXECUTEDEFAULT);
            break;
        }
Функции AddProcessToJob, Open и другие не нужны.
0
1 / 1 / 0
Регистрация: 20.09.2015
Сообщений: 69
01.03.2016, 21:23  [ТС]
Все сделал, как Вы сказали, но результата нет.
0
 Аватар для rao
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
01.03.2016, 22:34
А что есть? Какие-нибудь ошибки, предупреждения? Калькуляторы то хоть запускаются? Что возвращает CreateTimerQueueTimer ?
Если уж совсем никак не взлетает, выкладывай проект целиком - лучше один раз увидеть, чем 100 раз по кусочкам.
0
1 / 1 / 0
Регистрация: 20.09.2015
Сообщений: 69
03.03.2016, 18:32  [ТС]
Ошибок нет, калькулятор запускает, но не закрывает по истечении десяти секунд. Это и есть весь "проект", а если быть точнее, то лабораторная работа (:
Значение CreateTimerQueueTimer: 0x00007ff69b952dc4 {spo_kolinko01.exe!CreateTimerQueueTimer }
0
 Аватар для rao
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
03.03.2016, 19:46
Да, там хэндл таймера теряется. Вот более надёжный вариант с синхронизацией: (вместо мьютексов)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <list>
using namespace std;
 
list<HANDLE> g_listTimers;
CRITICAL_SECTION g_CriticalSection; 
 
void CALLBACK TimerProc(PVOID lpParameter, BOOLEAN TimerOrWaitFired)
{
    TerminateProcess( (HANDLE)lpParameter, 0);
    EnterCriticalSection(&g_CriticalSection);
    DeleteTimerQueueTimer(NULL, *(g_listTimers.rbegin()) , NULL);
    g_listTimers.erase(--g_listTimers.end());
    LeaveCriticalSection(&g_CriticalSection);
}
в main()'е инициализируешь/перед выходом удаляешь:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void main()
{
    setlocale(LC_ALL, "Russian");
    InitializeCriticalSection(&g_CriticalSection);
    ...
        case 1:
        {
            STARTUPINFO si = {0};
            si.cb = sizeof(si);
            PROCESS_INFORMATION pi = {0};
            TCHAR sProgramm[] = L"calc.exe";
            CreateProcess(NULL, (LPWSTR)&sProgramm, NULL, NULL, false, 0, NULL, NULL, &si, &pi);
            EnterCriticalSection(&g_CriticalSection);
            g_listTimers.push_front(hNewTimer);
            CreateTimerQueueTimer(&*(g_listTimers.begin()), NULL, (WAITORTIMERCALLBACK)TimerProc, pi.hProcess, 10000, 0, WT_EXECUTEDEFAULT);
            LeaveCriticalSection(&g_CriticalSection);
            break;
        }
    ...
    DeleteCriticalSection(&g_CriticalSection);
}
0
1 / 1 / 0
Регистрация: 20.09.2015
Сообщений: 69
03.03.2016, 22:47  [ТС]
Теперь по прошествии десяти секунд выскакивает исключение:
Необработанное исключение по адресу 0x00007FF86DAA5B6B (ntdll.dll) в spo_kolinko01.exe: 0xC0000005: нарушение прав доступа при записи по адресу 0x0000000000000024.
0
 Аватар для rao
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
05.03.2016, 10:14
Вот проект, компилился Visual Studio 2008, у меня работает:
Вложения
Тип файла: zip testConsole.zip (4.2 Кб, 7 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.03.2016, 10:14
Помогаю со студенческими работами здесь

Создание процесса из программы для защиты основного от несанкционированного завершения
Решил написать для своей программы систему защиты от убийства процесса. Хочу создавать из программы процесс, который будет следить за...

Ожидание запуска и завершения процесса для работы с потоками ввода
здравствуйте. есть программа на vb, которая при работе запускает другой процесс, чтобы затем передать ему данные через stdin. сейчас...

Бесконечный цикл с командами для обнаружения, завершения и запуска процесса
Всем привет столкнулся с проблемой написании цикла на CMD Он должен быть бесконечным. Цикл (Пишу по русски, не сочтите за критина) ...

Kакой сигнал вызывается системой для завершения процесса(ов) при shutdown?
Доброго времени суток, Подскажите, как убиваются/завершаются процессы при завершении работы и перезагрузке? Пытаюсь перехватить сигналы...

Использование функциональных клавиш для завершения программы
Вводится текст. Конец ввода &lt;F6&gt;. Найти количество заглавных букв. program zaglavnye; uses crt; var y, z: integer; ch: char; ...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru