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

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

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

WaitForSlngleObject или SetWaitableTimer - C++

20.05.2011, 21:31. Просмотров 2521. Ответов 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х секунд. Кода выйдет намного меньше, но есть опасения, что я неправильно понял работу функции и моя идея глупа?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.05.2011, 21:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос WaitForSlngleObject или SetWaitableTimer (C++):

Аналог SetWaitableTimer в C# - C#
Всем привет, В WIN API есть функция SetWaitableTimer для установки ожидаемого таймера. Если в последнем параметре этой функции (BOOL...

Как бороться с функцией в SetWaitableTimer? - Visual C++
программа: VOID CALLBACK Proc_for_timer(LPVOID lpArg,DWORD dwTimerLowValue,DWORD dwTimerHighValue ) { MEMORYSTATUSEX statex; ...

Intel или AMD? R9-290 GAMING 4G или N780 или SLI? Комп за овер 50к - Игровой компьютер
Комп нужен для ИГР на 5лет примерно! 1) Смысл поста в том чтобы собрать системник чтоб каждая запчасть работала на все 100%, то есть...

Можно ли по названию платы,или по чипу,или по соккету,определить,поддерживает плата ХР или нет? - Материнские платы
Добрый день всем.Уважаемые знатоки,я заранее прошу у Вас прощенья,если заданный мной вопрос,тупой или глупый. Но поверьте,я уже замучился...

Получить из строки всё до пробела или запятой или точки или восклицательного знака - C#
Match m_ = Regex.Match(вопрос, @"Кто такой.(.{5})", RegexOptions.IgnoreCase | RegexOptions.Multiline); ...

По введённой букве определить её характеристики: большая или маленькая, гласная или согласная, звонкая или глухая и т.д - VBA
По введённой букве определить её характеристики: боль-шая или маленькая, гласная или согласная, звонкая или глухая и т.д.

8
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
20.05.2011, 21:45 #2
Цитата Сообщение от rodgenk Посмотреть сообщение
Кода выйдет намного меньше, но есть опасения, что я неправильно понял работу функции и моя идея глупа?
ну вообще нормальная практика
0
rodgenk
1 / 1 / 0
Регистрация: 20.05.2011
Сообщений: 4
20.05.2011, 21:51  [ТС] #3
alex_x_x, а можно пример нормальной практики? Если не сложно и есть время.
У нас в группе все ребята делают с помощью таймеров ожидания, бесконечный цикл и выход из него только по приходу подтверждения. А так получается таймеры ВООБЩЕ не нужны.
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
20.05.2011, 21:57 #4
Цитата Сообщение от rodgenk Посмотреть сообщение
А так получается таймеры ВООБЩЕ не нужны.
таймер незаменим при циклических сигналах и в случаях, когда вы не знаете, когда начался отсчет
0
Aneron
158 / 157 / 12
Регистрация: 20.04.2010
Сообщений: 570
20.05.2011, 21:58 #5
а нельзя что ли обычным селектом ждать? И зачем придумывать какие то новые способы
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
20.05.2011, 22:05 #6
Цитата Сообщение от Aneron Посмотреть сообщение
а нельзя что ли обычным селектом ждать? И зачем придумывать какие то новые способы
Sleep'ом всмысле?
но так придется ждать две секунды вне зависимости от того когда произойдет сигнал
0
rodgenk
1 / 1 / 0
Регистрация: 20.05.2011
Сообщений: 4
20.05.2011, 22:14  [ТС] #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'ами?
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
20.05.2011, 22:19 #8
DWORD dw = WaitForSingleObject(H, 2000);
просто
а так да
а что за флаг?
0
rodgenk
1 / 1 / 0
Регистрация: 20.05.2011
Сообщений: 4
20.05.2011, 22:30  [ТС] #9
Сервер при получении команды в ответ посылает "ОК".
Флаг означает, что сервер получил команду и ее обрабатывает. Не додумался как проще сделать подтверждение доставки
Клиент проверяет
C
1
2
3
4
if(strcmp(RecvData,"OK") == 0)  //принято подтверждение
{
    flag = 1;
}
В итоге, если ОК не приходит в течении 2х секунд, пробуем еще 4 раза. Если так и не зашли в case WAIT_OBJECT_0: - то неудачная отправка.
А я мучался с таймерами.
1
20.05.2011, 22:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.05.2011, 22:30
Привет! Вот еще темы с ответами:

Игры зависают вместе с компьютером, или закрываются с сообщением об ошибке или без него, или вызывают BSOD - BSOD
Столкнулся тут с такой проблемой. Изначально проблемы были только с Dark Souls 3, а именно: 1) Игра просто закрывается. Без ошибок. 2)...

По введённой букве определить её характеристики: боль-шая или маленькая, гласная или согласная, звонкая или глухая и т.д - VBA
По введённой букве определить её характеристики: большая или маленькая, гласная или согласная, звонкая или глухая и т.д

Открыть MS Word 2003 или 2007 или 2010 в XP или 7 - Delphi WinAPI
Всем привет! столкнулся с проблемой. Надо из делфи запустить мс ворд. Ну это не сложно. проблема в том, что я сижу на WinXP а вдруг в...

Огонь на Pascale (или ABC, или Free, или Turbo) - Pascal
Пожалуйста, обрадуйте кто нибудь, кодом Движения Огня на Pascale.


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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