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

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

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

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

14.08.2014, 22:37. Просмотров 262. Ответов 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.");
    }
}
Проблема в том, что программа иногда ведёт себя странным образом.

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

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

Одновременная запись - C++
Здравствуйте, я написал код программы, суть в том, что создается список чисел и массив этих же чисел. Приходится два раза вводит число....

SQLite Блокровка/разблокировка - C++
Есть код: таймер периодически создает/запускает поток, поток получает данные ( через интернет) открывает БД (sqlite3_open() ) и добавляет...

Одновременная работа с документами - C++
Доброго всем! Можете помочь разобраться с такой задачей. Вот у меня допустим есть метод для поиска какой-то строки в файле. Как это...

Одновременная работа cout и printf в с++ - C++
Я уже поняла, что вместе cout и printf не использовать.Но таблицу вывести нужно.При чем у-double, т.е. нужно использовать форматированный...

Одновременная работу двух циклов openMP - C++
как можно сделать так чтобы два цикла работали одновременно? #pragma omp parallel { #pragma omp sections { #pragma omp...

Программа шифрования файлов с возможностью расширения функционала - C++
Всем добрый вечер! Очень прошу помощи! Завтра сдавать задание: Написать программу, для шифрования файлов. В программе должно быть...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
krv
73 / 53 / 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
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.08.2014, 11:49
Привет! Вот еще темы с ответами:

Объединить два функционала - создание окон и рисование в них - C++
Доброго времени суток. Помогите пожалуйста или хотя бы подскажите как соединить два кода в один. Задача состоит в том, чтобы программа...

Одновременная реализация константного и неконстантного оператора [] в классе string - C++
Вобщем, проблема в следующем: нужно реализовать обращение по индексу в классе string двумя вариантами оператора : константный (для чтения)...

Класс "Прямоугольник" с олным набором функционала (расчёт площади, периметра и т.д.) - C++
разработать класс для прямоугольника чтоб считал площадь периметр и тд всё что можно...чтобы присутствовал конструктор диструктор,функции...

Блокировка и разблокировка пользователей - CMD/BAT
Помогите пожалуйста ! Нужно создать bat который блокирует и разблокирует пользователей!


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

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

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