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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.63
rodgenk
1 / 1 / 0
Регистрация: 20.05.2011
Сообщений: 4
#1

WaitForSlngleObject или SetWaitableTimer - C++

20.05.2011, 21:31. Просмотров 2370. Ответов 8
Метки нет (Все метки)

Здравствуйте. Есть программа многопоточный клиент и сервер.
Клиент посылает простейшие команды - показать список файлов (ls), например.
Сервер обрабатывает и возвращает данные.

Нужно добавить подтверждение доставки команды на сервер. Если команда доставлена - сервер отправляет клиенту - ОК. Если ОК в течении 2х секунд не пришло, делаем еще одну попытку.
Сначала решал с помощью таймера ожидания в отдельном потоке. Ждем 2 секунды, устанавливаем событие в сигнальное положение, делаем повторную отправку, пока не получим ОК. Пока так и не доделал.
C++
1
2
3
4
5
6
        LARGE_INTEGER liDueTime;
    liDueTime.QuadPart = -2*1000*1000*10; 
    SetWaitableTimer(hTimer, &liDueTime, 0, NULL, NULL, 0);  
    WaitForSingleObject(hTimer, INFINITE);
    SetEvent(*TimerOverflowEvent);
    return 0;
Но потом подумал можно ли сделать с помощью функции WaitForSlngleObject?
C++
1
2
3
4
5
6
7
8
9
10
11
    DWORD dw = WaitForSlngleObject(hProcess, 2000);
    switch (dw) 
    { 
    case WAIT_OBJECT_0: 
    // процесс завершается 
    break;
 
    case WAIT_TIMEOUT: 
    // процесс не завершился в течение 2000 мс 
    break;
    }
То есть ждать получения ОК - установить соответсвующее событие в сигнальное положение - hProcess, либо прошествия 2х секунд. Кода выйдет намного меньше, но есть опасения, что я неправильно понял работу функции и моя идея глупа?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.05.2011, 21:31     WaitForSlngleObject или SetWaitableTimer
Посмотрите здесь:

C++ Книги или справочники для опытных(или проффесиональных) программистов!
Или я дурак или лыжи не едут, склоняюсь к первому. C++
Вложенные CMap или CArray-объекты. Ошибка компилятора или неправильная работа. C++
Контроль точности Рунге-Кутта (3 или 4 порядка) или Эйлера. C++
Имеет ли смысл продолжать учить с++ или попробовать перейти в с# или java? C++
C++ Создать программу при нажатии на кнопку м или ж выводились муржской или женский пол.
Определить лежит ли точка внутри или вне круга,ограниченного указанной окружностью, или на окружности C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
20.05.2011, 21:45     WaitForSlngleObject или SetWaitableTimer #2
Цитата Сообщение от rodgenk Посмотреть сообщение
Кода выйдет намного меньше, но есть опасения, что я неправильно понял работу функции и моя идея глупа?
ну вообще нормальная практика
rodgenk
1 / 1 / 0
Регистрация: 20.05.2011
Сообщений: 4
20.05.2011, 21:51  [ТС]     WaitForSlngleObject или SetWaitableTimer #3
alex_x_x, а можно пример нормальной практики? Если не сложно и есть время.
У нас в группе все ребята делают с помощью таймеров ожидания, бесконечный цикл и выход из него только по приходу подтверждения. А так получается таймеры ВООБЩЕ не нужны.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
20.05.2011, 21:57     WaitForSlngleObject или SetWaitableTimer #4
Цитата Сообщение от rodgenk Посмотреть сообщение
А так получается таймеры ВООБЩЕ не нужны.
таймер незаменим при циклических сигналах и в случаях, когда вы не знаете, когда начался отсчет
Aneron
 Аватар для Aneron
157 / 156 / 12
Регистрация: 20.04.2010
Сообщений: 570
20.05.2011, 21:58     WaitForSlngleObject или SetWaitableTimer #5
а нельзя что ли обычным селектом ждать? И зачем придумывать какие то новые способы
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
20.05.2011, 22:05     WaitForSlngleObject или SetWaitableTimer #6
Цитата Сообщение от Aneron Посмотреть сообщение
а нельзя что ли обычным селектом ждать? И зачем придумывать какие то новые способы
Sleep'ом всмысле?
но так придется ждать две секунды вне зависимости от того когда произойдет сигнал
rodgenk
1 / 1 / 0
Регистрация: 20.05.2011
Сообщений: 4
20.05.2011, 22:14  [ТС]     WaitForSlngleObject или SetWaitableTimer #7
Спасибо за ответы.
Попытался отобразить свои мысли в коде:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    HANDLE H = CreateEvent(NULL, TRUE, FALSE, NULL);
    //получили подтверждение от сервера
    if(flag == 1){
        SetEvent(H);  
    }
        //повторная отправка или дальнейшая работа
    DWORD dw = WaitForSingleObject(*H, 2000); 
    switch(dw) 
    { 
        case WAIT_OBJECT_0: 
        //ЗДЕСЬ: Успешная доставка и дальнейшая работа
        printf("Good Job!");
        break;
 
        case WAIT_TIMEOUT: 
        //ЗДЕСЬ: повторная передача сообщения
        break;
 
        case WAIT_FAILED:
        // неправильный вызов функции (неверный описатель) 
        break; 
    }
Правильно мыслю с Event'ами?
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
20.05.2011, 22:19     WaitForSlngleObject или SetWaitableTimer #8
DWORD dw = WaitForSingleObject(H, 2000);
просто
а так да
а что за флаг?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.05.2011, 22:30     WaitForSlngleObject или SetWaitableTimer
Еще ссылки по теме:

При вводе элементов массива выводить их тип (или int или float) C++
C++ Количество нулевых, или положительных, или отрицательных элементов в двумерном массиве
C++ Написать программу вычисления площади треугольники или квадрата или трапеции
Как найти текст в файле и возвратить 0 или 1 в зависимости от того,найдено или нет? C++
Придумать и описать создание списка или стека или очереди. И работу с ними. C++

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

Или воспользуйтесь поиском по форуму:
rodgenk
1 / 1 / 0
Регистрация: 20.05.2011
Сообщений: 4
20.05.2011, 22:30  [ТС]     WaitForSlngleObject или SetWaitableTimer #9
Сервер при получении команды в ответ посылает "ОК".
Флаг означает, что сервер получил команду и ее обрабатывает. Не додумался как проще сделать подтверждение доставки
Клиент проверяет
C
1
2
3
4
if(strcmp(RecvData,"OK") == 0)  //принято подтверждение
{
    flag = 1;
}
В итоге, если ОК не приходит в течении 2х секунд, пробуем еще 4 раза. Если так и не зашли в case WAIT_OBJECT_0: - то неудачная отправка.
А я мучался с таймерами.
Yandex
Объявления
20.05.2011, 22:30     WaitForSlngleObject или SetWaitableTimer
Ответ Создать тему
Опции темы

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