1 / 1 / 0
Регистрация: 20.09.2015
Сообщений: 65
1

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

23.02.2016, 19:09. Показов 1118. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.02.2016, 19:09
Ответы с готовыми решениями:

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

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

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

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

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

Все запущенные калькуляторы добавляются в один job. А через 10 сек они все сразу закрыться должны или кажды индивидуально в зависимости от времени своего запуска?
0
1 / 1 / 0
Регистрация: 20.09.2015
Сообщений: 65
25.02.2016, 22:07  [ТС] 5
Каждый индивидуально желательно.
0
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
25.02.2016, 22:29 6
Для консоли никогда не юзал 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
902 / 423 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
26.02.2016, 19:24 7
Хм, интересно получилось: 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
Сообщений: 65
01.03.2016, 21:23  [ТС] 8
Все сделал, как Вы сказали, но результата нет.
0
902 / 423 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
01.03.2016, 22:34 9
А что есть? Какие-нибудь ошибки, предупреждения? Калькуляторы то хоть запускаются? Что возвращает CreateTimerQueueTimer ?
Если уж совсем никак не взлетает, выкладывай проект целиком - лучше один раз увидеть, чем 100 раз по кусочкам.
0
1 / 1 / 0
Регистрация: 20.09.2015
Сообщений: 65
03.03.2016, 18:32  [ТС] 10
Ошибок нет, калькулятор запускает, но не закрывает по истечении десяти секунд. Это и есть весь "проект", а если быть точнее, то лабораторная работа (:
Значение CreateTimerQueueTimer: 0x00007ff69b952dc4 {spo_kolinko01.exe!CreateTimerQueueTimer}
0
902 / 423 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
03.03.2016, 19:46 11
Да, там хэндл таймера теряется. Вот более надёжный вариант с синхронизацией: (вместо мьютексов)
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
Сообщений: 65
03.03.2016, 22:47  [ТС] 12
Теперь по прошествии десяти секунд выскакивает исключение:
Необработанное исключение по адресу 0x00007FF86DAA5B6B (ntdll.dll) в spo_kolinko01.exe: 0xC0000005: нарушение прав доступа при записи по адресу 0x0000000000000024.
0
902 / 423 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
05.03.2016, 10:14 13
Вот проект, компилился Visual Studio 2008, у меня работает:
Вложения
Тип файла: zip testConsole.zip (4.2 Кб, 3 просмотров)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.03.2016, 10:14
Помогаю со студенческими работами здесь

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru