Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
mh-coder
-36 / 29 / 4
Регистрация: 01.02.2014
Сообщений: 839
1

Как организовать выполнение потока по таймеру

25.05.2015, 20:36. Просмотров 1021. Ответов 7
Метки нет (Все метки)

Есть поток который безконечно работает, он должен выполнять определённые действия раз в 5 минут

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
bool Stop = 0;
DWORD WINAPI ThreadTimeCheckGate( LPVOID ){
 
    
 
while (true)
{
if( Stop ){
return 1;
}
 
Sleep(300000);
// что-то делаем
}
 
 
}
теперь вопрос встал в том чтобы его коректно завершить, по идеи я делаю переменую Stop true и поток завершается, но перед этим цыкл будет ждать окончания пити минут слипа, чтоточень долго, как это всё можно организовать иначе?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.05.2015, 20:36
Ответы с готовыми решениями:

Выполнение кода из одного потока в другом потоке
Существует ли в C++ какой-нибудь механизм для выполнения куска кода из одного...

Как ускорить выполнение кода? (Получение цвета пикселя, сравнение и выполнение действия)
Всем привет. Нужна консультация экспертов) Программа такая. Есть пиксель на...

Как менять значение переменной по таймеру?
Как менять значение переменной angle по таймеру, что бы в WM_PAINT, при вызове...

Как организовать цикл по таймеру?
Здравствуйте, уважаемые специалисты! Не могу сообразить, как организовать цикл...

Как организовать вызов asp. по таймеру
Как организовать вызов asp. по таймеру Имеется в виду. Чтото типа чата. т.е....

7
Zugunder
0 / 0 / 0
Регистрация: 31.05.2014
Сообщений: 24
25.05.2015, 20:42 2
Ну так жди/считай 5 секунд по 60.

А лучше смотри стандартные таймеры винды с колбеком.
0
tnk500
114 / 118 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
Завершенные тесты: 3
25.05.2015, 20:51 3
mh-coder, конечно бесконечный, у тебя переменная stop никак не может измениться в пределах цикла while, поэтому код никогда не доберется до return 1. Засовывай все тело функции в цикл.
0
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
25.05.2015, 21:02 4
mh-coder, используйте события
0
mh-coder
-36 / 29 / 4
Регистрация: 01.02.2014
Сообщений: 839
25.05.2015, 21:09  [ТС] 5
Цитата Сообщение от tnk500 Посмотреть сообщение
конечно бесконечный, у тебя переменная stop никак не может измениться в пределах цикла while, поэтому код никогда не доберется до return 1. Засовывай все тело функции в цикл.
ну так всё тело и так в цикле, переменна из вне изменяется (в главном потоке) и всё норм отрабатывает

Цитата Сообщение от Zugunder Посмотреть сообщение
Ну так жди/считай 5 секунд по 60.
тоже думал об этом, а это рационально?

Цитата Сообщение от Zugunder Посмотреть сообщение
А лучше смотри стандартные таймеры винды с колбеком.
а без калбека есть таймеры?

Цитата Сообщение от retmas Посмотреть сообщение
используйте события
а чем оно мне поможет?
0
tnk500
114 / 118 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
Завершенные тесты: 3
25.05.2015, 21:11 6
mh-coder, да, я не заметил скобки.
0
Zugunder
0 / 0 / 0
Регистрация: 31.05.2014
Сообщений: 24
25.05.2015, 21:17 7
https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

Просто и элегантно
колбек ф-ция може сразу новый таймер на себя выставлять
0
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
25.05.2015, 21:28 8
Лучший ответ Сообщение было отмечено mh-coder как решение

Решение

Цитата Сообщение от mh-coder Посмотреть сообщение
а чем оно мне поможет?
не нужен слип, не нужны всякие стопы, можно установить сколько его ожидать, и если сработает до истечения ожидаемого времени, вы об этом узнаете, чтобы завершить поток. если же нет - продолжаете

Добавлено через 4 минуты
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
#include <windows.h>
#include <stdio.h>
 
HANDLE event;
 
DWORD WINAPI ThreadTimeCheckGate(LPVOID)
{
    DWORD res;
    while(true)
    {
        res = WaitForSingleObject(event, 300000);
        switch(res)
        {
        case WAIT_OBJECT_0:
            // просигналило событие завершения
            ExitThread(0);
            break;
        case WAIT_TIMEOUT:
            // продолжаем работу
            break;
        default:
            // бидапичаль
            printf("Wait error (%d)\n", GetLastError());
            ExitThread(1);
            return 0;
        }
        // работаем
    }
}
 
int main(void)
{
    HANDLE thread;
 
    event = CreateEvent(NULL, TRUE, FALSE,  NULL);
    if(event == NULL)
    {
        printf("CreateEvent error: %d\n", GetLastError());
        return 1;
    }
 
    thread = CreateThread(NULL, 0, ThreadTimeCheckGate, NULL, 0, NULL);
    if(thread == NULL)
    {
        printf("CreateThread error: %d\n", GetLastError());
        return 1;
    }
 
    // что-то делаем
    // ...
    // сигналим о завершении потока
    SetEvent(event);
    // ...
    WaitForSingleObject(thread, INFINITE);
    CloseHandle(thread);
    CloseHandle(event);
    return 0;
}
1
25.05.2015, 21:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.05.2015, 21:28

Выполнение слота основного потока через сигнал второстепенного потока
Доброго времени суток! Вопрос следующий. В основном потоке создается кнопка и...

Как остановить выполнение потока
private void button1_Click(object sender, EventArgs e) {//старт ...

Как завершить выполнение потока
Делаю так: int btncnt = 0; private void button1_Click_1(object...


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

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

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