Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание таймера, чтобы событие вызывалось не через цикл 
V
    Опции темы
CYBERDREAM
Дата 10.10.2007, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: нет
Всего: 28



Приветствую всех.
В моей программе в бесконечном цикле считываются данные с внешнего устройства в некоторый массив. После каждого считывания счетчик обнуляется, а когда счетчик доходит до 5 секунд мне нужно передать данные в файл и обнулить массив.
Код

int SecCount=0
VOID CALLBACK TP1(HWND hwnd,UINT uMsg, UINT idEvent, DWORD dwTime)
{
    SecCount++;
    printf("SecCount = %i\n",SecCount);
    if(SecCount==5)
    {
        //вызов программы
    }
}
int main(int argc, _TCHAR* argv[])
{
    .....
    SetTimer(NULL,10,10,(TIMERPROC)TP1);
    MSG msg;
    BOOL bRet;

    while ( reader )
    {
        
        if((bRet=GetMessage(&msg,NULL,0,0))!=0 && bRet!=-1)
        {
            TranslateMessage(&msg); 
            DispatchMessage(&msg); 
        }
        //если произошло считывание
        if (_inventoryNtf)
        {
            SecCount=0;
           //произошло считывание
        }
    }
}

Проблема состоит в том, что данные считываются тоже с периодичностью таймера, как сделать чтобы они паралелльно работали (таймер и считывание)


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
SenkraD
Дата 10.10.2007, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 4
Всего: 23



1. CYBERDREAM,  а обьекты синхронизации использовать пробовал? 
    Если у тебя запись и считывание в разных потоках, то очевидно самый
    правильный способ решения проблемы
2. У тебя проходит не 5 секунд а полсекундыи то не факт (задай необходимый интервал,
    при создании таймера)
3. В твоём случае использовать таймер на основе  функции SetTimer, не то - наверное,
    лучше использовать CreateWaitableTimer: она создаст таймер, который будет обьектом ядра,
   что даёт тебе больше гарантий


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
CYBERDREAM
Дата 15.10.2007, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: нет
Всего: 28



если использовать CreateWaitableTimer, будет ли считывание идти паралельно работе таймера, или последний будет притормаживать процесс. smile 


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
Lazin
Дата 15.10.2007, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 8
Всего: 154



CYBERDREAM, если вынесешь считывание в параллельный поток то не будет.
PM MAIL Skype GTalk   Вверх
CYBERDREAM
Дата 15.10.2007, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: нет
Всего: 28



Можно поинтерисоваться каким образом это осуществить, я с winapi туго очень... нет времени пока что заняться им.


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
jonie
Дата 16.10.2007, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



а почему бы не организовать кальцевую очередь и сразу в одном потоке писать данные в нее, в другом выбирать... хотя хочется с таймерами если Ы... msdn вам в помошь...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
CYBERDREAM
Дата 16.10.2007, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: нет
Всего: 28



У меня нет требования жестко таймер сделать. Мне главное чтобы после каждого считывания метки счетчик (по секундный) обнулялся и начинал заново считать, и после 5 секундного простоя сработало некоторое событие. А в данном случае таймер тормозит процесс считывания.

jonie, можешь кусок кода привести?



--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
Lazin
Дата 16.10.2007, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 8
Всего: 154



Создай поток, в котором выполнялась бы ф-я:
Код

//ф-я потока
unsigned int __stdcall threadProc(void*)
{
int elapse = 5000;
LARGE_INTEGER lElapse;
lElapse.QuadPart = - (elapse * 10000);
HANDLE timer = CreateWaitableTimer(NULL, FALSE, NULL);
SetWaitableTimer(timer, &lElapse, elapse, NULL, NULL, FALSE);

while (true)
{
  DWORD result = WaitForSingleObject(timer, INFINITE);
  if ( result == WAIT_OBJECT_0 )
  {
   //*******
  }
}
}

Тут не хватает только нормального завершения потока. Его можно сделать через событие или сообщение.
PM MAIL Skype GTalk   Вверх
jonie
Дата 16.10.2007, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



Цитата

jonie, можешь кусок кода привести?
лучше у гугла...
http://rk6.bmstu.ru/electronic_book/posapr...npo/Ochered.htm
а вообще игра змейка поможет )


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0636 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.