Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 52, средняя оценка - 4.81
SentineL-88
1 / 1 / 0
Регистрация: 21.06.2010
Сообщений: 23
#1

таймер в консольном приложении win32 - C++

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

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

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

Если реально, прошу пояснить какими средствами это можно сделать и было бы не плохо какой-нибудь коротенький пример.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dexter
285 / 145 / 16
Регистрация: 13.10.2009
Сообщений: 164
25.02.2011, 13:32     таймер в консольном приложении win32 #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;
}
SentineL-88
1 / 1 / 0
Регистрация: 21.06.2010
Сообщений: 23
25.02.2011, 13:51  [ТС]     таймер в консольном приложении win32 #3
большое спасибо. попробую, как минутка выдастся
ValeryS
Модератор
6542 / 5008 / 461
Регистрация: 14.02.2011
Сообщений: 16,653
27.02.2011, 00:52     таймер в консольном приложении win32 #4
Sleep ???
SentineL-88
1 / 1 / 0
Регистрация: 21.06.2010
Сообщений: 23
01.03.2011, 17:26  [ТС]     таймер в консольном приложении win32 #5
ещё вопрос: как передать некоторые параметры в функцию WaitingFor из примера
DexterUa? Если никак, можно ли получить от неё разные значения, в зависимости от того, что было нажато? (пробовал через if/else писать разные return, плодов не принесло.
Dexter
285 / 145 / 16
Регистрация: 13.10.2009
Сообщений: 164
01.03.2011, 17:59     таймер в консольном приложении win32 #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. уже под коньяком, если что-то не так - пиши в личку - отвечу, или сюда, отвечу - завтра/послезавтра

Если надо несколько параметров передать, смотрите направление - передача нескольких параметров в поток. (Подробнее смогу ответить не сегодня =) хотя там все просто)
SentineL-88
1 / 1 / 0
Регистрация: 21.06.2010
Сообщений: 23
01.03.2011, 19:09  [ТС]     таймер в консольном приложении win32 #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 разных алгоритма. И при этом, чтобы указатели НЕ были определены глобально. Стало быть, их либо нужно передать в функцию, либо вынести алгоритмы из функции, но тогда получать из неё разные значения. Конечно, использую последний пример можно менять значения какой-нибудь глобальное переменной, но это ни чуть не лучше, чем определить глобально указатели, что я и сделал на данный момент. Хотелось бы, всё-таки, избежать этого.

попытаюсь почитать про передачу нескольких параметров в поток, может, разберусь сам.
bigredcat
364 / 311 / 3
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
01.03.2011, 19:25     таймер в консольном приложении win32 #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
SentineL-88
1 / 1 / 0
Регистрация: 21.06.2010
Сообщений: 23
01.03.2011, 19:35  [ТС]     таймер в консольном приложении win32 #9
Проблема как раз в том, что я не знаю как передать эту самую структуру =)
bigredcat
364 / 311 / 3
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
01.03.2011, 22:18     таймер в консольном приложении win32 #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 как нам надо
...
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2012, 07:25     таймер в консольном приложении win32
Еще ссылки по теме:
Музыка в консольном приложении C++ WinAPI
Timer в консольном приложении C++
C++ Вывод в консольном приложении
Таблица в консольном приложении C++
Графика в консольном приложении C++

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

Или воспользуйтесь поиском по форуму:
rambayke
2 / 2 / 0
Регистрация: 31.07.2012
Сообщений: 71
31.07.2012, 07:25     таймер в консольном приложении win32 #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 функции параллельно.
Yandex
Объявления
31.07.2012, 07:25     таймер в консольном приложении win32
Ответ Создать тему
Опции темы

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