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

C++

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

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

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

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

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

Если реально, прошу пояснить какими средствами это можно сделать и было бы не плохо какой-нибудь коротенький пример.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.02.2011, 11:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос таймер в консольном приложении win32 (C++):

Как в консольном приложении узнать текущую директорию? - C++
Пишу в Visual C++ 2008.

Музыка/мелодия в консольном окне С++ - C++
Доброго времени суток! Появился вопрос - существует ли возможность, прикрутить музыку, или небольшую мелодию к консольному приложению?...

NMHTTP в консольном приложении. - C++ Builder
Здравствуйте ув. форумчане! Столкнулся с проблемой использования компонента NMHTTP в console application: #include <NMHttp.hpp> ...

Ошибки в консольном приложении - C++ Builder
в приложении с формами этот код работает как миленький, попробовал перенести его в консольное, что б уменьшить размер, и получил вот...

Борьба с крякозябрами в консольном приложении - C++ Builder
Пытаюсь бороться с крякозябрами в консольном приложении: Нашел статью http://www.rsdn.ru/article/qna/ui/concp.xml. В ней описаны...

Как изменить иконку в консольном приложении? - C++ Builder
как в C++ Builder изменить иконку в консольном приложении?

10
Dexter
285 / 145 / 16
Регистрация: 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
SentineL-88
1 / 1 / 0
Регистрация: 21.06.2010
Сообщений: 23
25.02.2011, 13:51  [ТС] #3
большое спасибо. попробую, как минутка выдастся
0
ValeryS
Модератор
6651 / 5060 / 470
Регистрация: 14.02.2011
Сообщений: 16,919
27.02.2011, 00:52 #4
Sleep ???
0
SentineL-88
1 / 1 / 0
Регистрация: 21.06.2010
Сообщений: 23
01.03.2011, 17:26  [ТС] #5
ещё вопрос: как передать некоторые параметры в функцию WaitingFor из примера
DexterUa? Если никак, можно ли получить от неё разные значения, в зависимости от того, что было нажато? (пробовал через if/else писать разные return, плодов не принесло.
0
Dexter
285 / 145 / 16
Регистрация: 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
SentineL-88
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
bigredcat
366 / 313 / 3
Регистрация: 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
SentineL-88
1 / 1 / 0
Регистрация: 21.06.2010
Сообщений: 23
01.03.2011, 19:35  [ТС] #9
Проблема как раз в том, что я не знаю как передать эту самую структуру =)
0
bigredcat
366 / 313 / 3
Регистрация: 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
rambayke
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2012, 07:25
Привет! Вот еще темы с ответами:

Обработка исключительных ситуаций в консольном приложении - C++ Builder
Всем добррого времени суток. Условие токово.Написать программу нахождения частного 2-х целых чисел. Организовать обработку исключительных...

Имя исполняемого exe файла в консольном приложении - C++ Builder
Всем привет! потребовалось написать небольшое консольное приложение, а под рукой только XE5. Необходимо получить имя exe файла, раньше...

Курсор в консольном режиме - C++ Builder
Вобщем написал небольшой текстовый редактор. Хочу каким-нибудь образом скрывать курсор на время перерисовки экрана. Как это сделать? ...

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


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

Или воспользуйтесь поиском по форуму:
11
Yandex
Объявления
31.07.2012, 07:25
Ответ Создать тему
Опции темы

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