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

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

Войти
Регистрация
Восстановить пароль
 
Andy Summers
0 / 0 / 0
Регистрация: 12.08.2014
Сообщений: 2
#1

Одновременная блокировка/разблокировка функционала программы - C++

14.08.2014, 22:37. Просмотров 253. Ответов 1
Метки нет (Все метки)

Прошу прощения за столь изворотливый заголовок темы.
Опишу суть проблемы.
Разрабатываю программу для работы с электронными токенами.
В программе присутствуют два потока: один предназначен для выполнения основного функционала (интерпретация команд пользователя), другой - для отслеживания событий в слотах.

Функционал программы в отсутствие токена ограничен. Для контроля за функционалом я завёл переменную булева типа. К ней может обращаться как основной поток, так и дополнительный. Для контроля событий используется проприетарная функция из библиотеки поставщика. Как только произошло очередное событие, проприетарная функция возвращает некий результат (0, если функция завершила свою работу успешно). Если она завершилась успешно, то далее происходит изменение состояния переменной, ответственной за контроль над функционалом (было false, стало true и наоборот). Выглядит это примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
while (true)
{
    int res = 0;
 
    if (res = fPtr->WaitSlotEvent(&slotID))
    {
        get_error_info(res);
        break;
    }
 
    if (*(fParam.inserted))
    {
        *(fParam.inserted) = false;
        *(fParam.blocked) = true;
        printf("Token was removed. Protected mode on.");
    }
    else
    {
        *(fParam.inserted) = true;
        *(fParam.blocked) = false;
        printf("Token was inserted. Protected mode off.");
    }
}
Проблема в том, что программа иногда ведёт себя странным образом.

Когда я вставляю токен, появляется одно из сообщений выше. Ошибок замечено не было, функционал блокируется/разблокируется, как и ожидалось. Но иногда, когда я вынимаю токен, появляются сразу ДВА сообщения. Отсюда имеем, что при извлечённом токене функционал не заблокирован, и наоборот, что приводит к тому, что приложение сыпится. В связи с чем это происходит? Как с этим бороться? Почему одновременно происходит блокировка/разблокировка? Стоит отметить, что основной поток только читает эту переменную, нигде её не изменяя.

В случае, если я опубликовал свой вопрос не там, где нужно, прошу модераторов перенести тему. Спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.08.2014, 22:37     Одновременная блокировка/разблокировка функционала программы
Посмотрите здесь:

C++ Одновременная реализация константного и неконстантного оператора [] в классе string
C++ Одновременная работа cout и printf в с++
Одновременная работа с документами C++
C++ Блокировка приложений.
C++ Блокировка рабочего стола!
C++ Блокировка кнопки выхода
C++ Класс "Прямоугольник" с олным набором функционала (расчёт площади, периметра и т.д.)
SQLite Блокровка/разблокировка C++
C++ Разработка приложения БЛОКИРОВКА на с++
Объединить два функционала - создание окон и рисование в них C++
Одновременная работу двух циклов openMP C++
C++ Программа шифрования файлов с возможностью расширения функционала

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
krv
72 / 52 / 11
Регистрация: 10.07.2014
Сообщений: 328
15.08.2014, 11:49     Одновременная блокировка/разблокировка функционала программы #2
Цитата Сообщение от Andy Summers Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
while (true)
{
  if (*(fParam.inserted))
 {
     ...
 }
 else
 {
 (fParam.inserted) = true;
 }
}
В общем, у тебя inserted становится true и срабатывает if в 11 строке. Скорее всего. Более точно можно выяснить, изучив режимы работы функции fPtr->WaitSlotEvent
Yandex
Объявления
15.08.2014, 11:49     Одновременная блокировка/разблокировка функционала программы
Ответ Создать тему
Опции темы

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