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

Таймер в консольном приложении win32

25.02.2011, 11:20. Показов 11633. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
результатом долгого и упорного нагугливания стало следующее:
SetTimer() в консольном приложении использовать тяжело: масс проблем, да и вообще так и не нашёл чёткого, однозначного решения. Как аналог, рекомендуют использовать Waitable Timer Objects. однако, пример оттуда http://www.installsetupconfig.... 11_24.html не компилируется в моём VC2010pro, выдавая массу ошибок.

вопрос один: реально ли в консольном приложении сделать так, чтобы программа ожидала некоторое количество времени некую команду (например, getch()) и выполняла некий алгоритм, если дождётся либо выполняла другой алгоритм (ничего не делала), если эта самая "некая команда" не получена?

Если реально, прошу пояснить какими средствами это можно сделать и было бы не плохо какой-нибудь коротенький пример.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.02.2011, 11:20
Ответы с готовыми решениями:

Музыка в консольном приложении
#include <conio.h> #include <Windows.h> #include <Mmsystem.h> #include <iostream> #include...

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

Таймер в консольном приложении
Подскажите, как сделать чтобы консольное приложение было постоянно запущено и раз в 1 минуту...

Вывод непонятных смайликов в консольном приложении win32 VC++
Собственно говоря проблемасовершенно не понимаю в чем тут дело, atoi работает, num обнуляется прямо...

10
291 / 151 / 34
Регистрация: 13.10.2009
Сообщений: 164
25.02.2011, 13:32 2
таймер в консольном приложении win32
Как-то я делал когда-то но сейчас не вспоминается (может я и ошибаюсь), там не так просто как в оконных приложениях.

вопрос один: реально ли в консольном приложении сделать так, чтобы программа ожидала некоторое количество времени некую команду (например, getch()) и выполняла некий алгоритм, если дождётся либо выполняла другой алгоритм (ничего не делала), если эта самая "некая команда" не получена?
Вот без таймера, а с событием:
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
#include  <windows.h>
#include <stdio.h>
#include <conio.h>
HANDLE hTimer = NULL;
 
DWORD WINAPI WaitingFor(LPVOID lParam)//функция окончание которой мы ждем, в данном случае getch()
{
    getch();
    SetEvent(hTimer);
    return 1;
}
 
int wmain()
{
    HANDLE MyThread;
    hTimer=CreateEvent(NULL, TRUE, FALSE, L"timer" );//делаем евент
    MyThread=CreateThread(NULL,0,WaitingFor,NULL,0,0);//запускаем в потоке нужную нам функцию
    DWORD res=WaitForSingleObject(hTimer, 10000);//ждем события в данном случае 10сек
    if (res == WAIT_OBJECT_0)//если событие было взведено, тоесть getch() получен
    {
        wprintf(L"WaitForSingleObject() - timer was signaled...\n");//чето делаем
    }
    else
    if (res == WAIT_TIMEOUT)//если ушли по таймауту - убиваем поток и чето делаем
    {
        wprintf(L"WaitForSingleObject() - time out...\n");
        CloseHandle(MyThread);
    }
    else//ну и на случай ошибки
        wprintf(L"WaitForSingleObject() failed, error %d\n", GetLastError());
    return 0;
}
2
1 / 1 / 0
Регистрация: 21.06.2010
Сообщений: 23
25.02.2011, 13:51  [ТС] 3
большое спасибо. попробую, как минутка выдастся
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
27.02.2011, 00:52 4
Sleep ???
0
1 / 1 / 0
Регистрация: 21.06.2010
Сообщений: 23
01.03.2011, 17:26  [ТС] 5
ещё вопрос: как передать некоторые параметры в функцию WaitingFor из примера
DexterUa? Если никак, можно ли получить от неё разные значения, в зависимости от того, что было нажато? (пробовал через if/else писать разные return, плодов не принесло.
0
291 / 151 / 34
Регистрация: 13.10.2009
Сообщений: 164
01.03.2011, 17:59 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
27
28
29
30
31
32
33
34
35
#include "stdafx.h"
#include  <windows.h>
#include <stdio.h>
#include <conio.h>
HANDLE hTimer = NULL;
int e;//чтобы получить результат с потока, то она должна быть либо глобальной, либо видимой в двух потоках
 
DWORD WINAPI WaitingFor(LPVOID lParam)//функция окончание которой мы ждем, в данном случае getch()
{
    printf("%s",lParam);//вывод параметра заданого в функцию
    e=getch();//e- результат функции getch()- код символа
    SetEvent(hTimer);
    return 1;
}
 
int wmain()
{
    HANDLE MyThread;
    hTimer=CreateEvent(NULL, TRUE, FALSE, L"timer" );//делаем евент
    MyThread=CreateThread(NULL,0,WaitingFor,"parametr",0,0);//запускаем в потоке нужную нам функцию, следующий параметр передается в функцию... (параметр может быть любого типа который преобразуется в LPVOID и обратно), то есть почти все.
    DWORD res=WaitForSingleObject(hTimer, 10000);//ждем события в данном случае 10сек
    if (res == WAIT_OBJECT_0)//если событие было взведено, тоесть getch() получен
    {
        wprintf(L"WaitForSingleObject() - timer was signaled...\n%c",e);//чето делаем, а точнее выведем букву полученую с getch();
    }
    else
        if (res == WAIT_TIMEOUT)//если ушли по таймауту - убиваем поток и чето делаем
        {
            wprintf(L"WaitForSingleObject() - time out...\n");
            CloseHandle(MyThread);
        }
        else//ну и на случай ошибки
            wprintf(L"WaitForSingleObject() failed, error %d\n", GetLastError());
    return 0;
}
p.s. уже под коньяком, если что-то не так - пиши в личку - отвечу, или сюда, отвечу - завтра/послезавтра

Если надо несколько параметров передать, смотрите направление - передача нескольких параметров в поток. (Подробнее смогу ответить не сегодня =) хотя там все просто)
1
1 / 1 / 0
Регистрация: 21.06.2010
Сообщений: 23
01.03.2011, 19:09  [ТС] 7
нет, в данном случае мне нужно немного не это: суть в том, что я работаю сейчас с устаревшей winbgim.h, так что там свой getch(), который не работает в функции, которую мы ожидаем. решал вопрос таком способом:

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
#include "stdafx.h"
#include "winbgim.h"
#include "windows.h"
#include <stdio.h>
 
HANDLE hTimer = NULL;
UINT arrow_right = MapVirtualKey(77,1);
UINT arrow_left = MapVirtualKey(75,1);
 
class Player
{...};
class map
{...};
 
Player *pl;
int **field;
DWORD WINAPI Moveing (LPVOID lParam)
{
    if (GetAsyncKeyState(arrow_right)) 
    {
        if (field[pl->get_x2()+1][pl->get_y1()-1]<1 && 
            field[pl->get_x2()+1][pl->get_y2()-1]<1) pl->move(1,0);
    }
    else if (GetAsyncKeyState(arrow_left)) 
    {
        if (field[pl->get_x1()-1][pl->get_y1()-1]<1 && 
            field[pl->get_x1()-1][pl->get_y2()-1]<1) pl->move(-1,0);
    }
    SetEvent(hTimer);
    return 1;
}
Мне надо, чтобы ожидалось одно из двух событий: стрелка влево и стрелка вправо, и выполнялось, соответственно, 2 разных алгоритма. И при этом, чтобы указатели НЕ были определены глобально. Стало быть, их либо нужно передать в функцию, либо вынести алгоритмы из функции, но тогда получать из неё разные значения. Конечно, использую последний пример можно менять значения какой-нибудь глобальное переменной, но это ни чуть не лучше, чем определить глобально указатели, что я и сделал на данный момент. Хотелось бы, всё-таки, избежать этого.

попытаюсь почитать про передачу нескольких параметров в поток, может, разберусь сам.
0
374 / 321 / 32
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
01.03.2011, 19:25 8
Цитата Сообщение от SentineL-88 Посмотреть сообщение
попытаюсь почитать про передачу нескольких параметров в поток, может, разберусь сам.
В чем проблема. Определи свою структуру (требуемые поля в ней) и передавай в поток указатель на эту структуру.

C++
1
2
3
4
5
6
7
8
typedef struct _THREAD_PARAMS
{
    int* param1;
    int param1_len;
    float* param2;
    int param2_len;
    ...
} THREAD_PARAMS, *PTHREAD_PARAMS
0
1 / 1 / 0
Регистрация: 21.06.2010
Сообщений: 23
01.03.2011, 19:35  [ТС] 9
Проблема как раз в том, что я не знаю как передать эту самую структуру =)
0
374 / 321 / 32
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
01.03.2011, 22:18 10
C++
1
2
3
4
5
6
7
8
HANDLE WINAPI CreateThread(
  __in          LPSECURITY_ATTRIBUTES lpThreadAttributes,
  __in          SIZE_T dwStackSize,
  __in          LPTHREAD_START_ROUTINE lpStartAddress,
  __in          LPVOID lpParameter,                                 //  <-- Вот здесь
  __in          DWORD dwCreationFlags,
  __out         LPDWORD lpThreadId
);
Добавлено через 12 минут
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
int main()
{
...
// Объявляем
THREAD_PARAMS tp = {0}
// Присваиваем, что нужно
tp.param1 = ...
tp.param1_len = ...
...
// Создаем поток с указателем на наши данные
hThread=CreateThread(NULL,0,MyThread,&tp,0,&dwThreadId)
...
}
 
// Функция потока.
DWORD WINAPI MyThread( LPVOID lpParam ) 
{
...
// Приводим к типу нашей структуры.
THREAD_PARAMS* tp = (THREAD_PARAMS*)lpParam;
 
// Теперь можем использовать tp как нам надо
...
}
1
2 / 2 / 0
Регистрация: 31.07.2012
Сообщений: 71
31.07.2012, 07:25 11
всем здраствуйте!
у меня возникли проблемы с SETTIMER'ом. он не работает, и не знаю почему. попробовал оба метода, кот. нашел в инете.
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
#include <iostream>
#include <conio.h>
#include "SerialGate.h"
#include <time.h>
 
using namespace std; 
 
const unsigned int TIMER_1SEC_SEND = 1;
const unsigned int TIMER_1SEC_RESV = 2;
 
void    __stdcall Send(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
{
    printf("!!!");
}
 
void __stdcall Resv(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
{
 
}
 
int main()
{
HWND hWnd;
 
SetTimer(hWnd,TIMER_1SEC_SEND,1000,(TIMERPROC)Send); 
SetTimer(hWnd,TIMER_1SEC_RESV,1000,(TIMERPROC)Resv);
 
/*
MSG msg;
 
while (1)
{
  if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
  {
    if (msg.message == WM_QUIT)
      break;
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }
}
*/
 
KillTimer (hWnd,TIMER_1SEC_SEND);  
KillTimer (hWnd,TIMER_1SEC_RESV);
 
    getch();
    return 0;
}
 
LRESULT __stdcall WndProc (HWND hWnd, UINT msg,
                           WPARAM wParam, LPARAM lParam)
{
  switch (msg)
  {
  case WM_DESTROY:
    PostQuitMessage(0);
    return 0;
  case WM_TIMER:     
  switch (wParam)  
    {
    case TIMER_1SEC_SEND:  
    {
        printf("SEND");
     }
    break;
    case TIMER_1SEC_RESV:
    {
         //
    }  
    break;
    }
    return 0;
  }
  return DefWindowProc(hWnd,msg,wParam,lParam);
}
вобщем, нужно каждую секунду выполнять 2 функции параллельно.
0
31.07.2012, 07:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.07.2012, 07:25
Помогаю со студенческими работами здесь

Таймер в консольном однопоточном приложении на c++
Привет всем! Я только начинаю разбираться в c++, но опыт программирования все же имеется, правда на...

Как реализовать таймер в консольном приложении?
И как-нибудь без while и sleep, чтобы программа не висела. Пытался делать через winapi, но не понял...

Графика в консольном приложении VS
подскажите как построить систему координат X,Y. в консольном приложении.Какие модули следует...

Тетрис в консольном приложении
Помогите с написанием тетриса в консоли, пожалуйста. Как сделать поле, и чтобы по нему...

Отладка в консольном приложении Qt
Прошу не ругаться :) Проблема - не работает отладка в консольном приложении Qt. Ставлю точку...

Вывод в консольном приложении
Всем доброго времени суток. Написал приложение выводящие через printf 5 строк с паузой в 1 сек....


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

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