![]() |
|
Модераторы: bsa |
![]()
|
|
| Migelь |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 25.2.2009 Репутация: нет Всего: нет |
Доброго времени суток!
Рассказываю о моей "беде". Главный поток программы создает вторичный поток, в который передает указатель на глобальную переменную типа myTime. Поток вычисляет количество секунд пошедших от начала суток до указанного времени и выводит на экран. Затем запоминает время и в последующем вычисляет разницу между новым и старым значениями. Так продолжается до тех пор, пока не будет передано время 00:00:00, после этого поток завершается. Главный поток в цикле вводит с клавиатуры значение времени во временную переменную time, необходимо синхронизировать потоки для корректной работы программы с помощью: критическая секция, Mutex, событие, семафоры. Я выбрал Mutex как самый простой и наиболее подходящий, на мой взгляд, для такого случая . Завершение цикла – ввод значения 00:00:00. ===== Теперь о главном - что не фурычит. С потоками происходят непонятные вещи: то не подключается ThreadFunction, а то и наоборот подключается и выполняет несколько раз свой цикл. Mutex по идее и должен от таких "сюрпризов" уберечь, однако так не происходит, в чем может быть ошибка? =====
На всякий случай еще source и header файлы проги, если вдруг кто решит "собрать".
======
Вот такие пироги. |
||||||
|
|||||||
| Migelь |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 25.2.2009 Репутация: нет Всего: нет |
Я тут нашел, кое-что
http://forum.vingrad.ru/forum/topic-186295...utex/index.html Правда, мне это не сильно помогло. Пробовал ставить sleep после ReleaseMutex(hMutex); - никакой разницы, за исключением задержки, те же чудеса. |
|||
|
||||
| Sirt |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 3.3.2009 Репутация: нет Всего: нет |
Mutex уберегает вас только от того, что секции, ограниченные WaitForSingleObject и ReleaseMutex, будут выполняться как единый блок относительно друг друга. То есть, например, GetTime никогда не выполнится между PutTime(time) и PutTime(zero) в вашем случае. Однако, очередность захвата Mutex-а никто не гарантирует, в частности, совершенно нормально, что дополнительный поток или основной могут захватить его пару раз подряд. Если нужно строго последовательное выполнение блоков в основной программе и дополнительном потоке, то это нужно обеспечивать самостоятельно. Первое, что пришло в голову - глобальная переменная, проверяемая на истинность и устанавливаемая в ложность внутри критической секции в одном потоке и наоборот - в другом.
|
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
не нужно устанавливать приоритет потоку, это раз
ф-я Proverka, проверяет значение общей переменной, но при этом, поток уже не владеет мютексом, поэтому, ф-я может быть вызвана во время изменения переменной time, два |
|||
|
||||
| Migelь |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 25.2.2009 Репутация: нет Всего: нет |
Убрал приоритет потока, что помогла не только от огромного зацикливания, иногда проскакивавшего, но и, что меня удивило, дало результатом то, что управление стало гарантированно передаваться от первого потока ко второму. Далее я просто поставил Sleep(50) сразу после ReleaseMutex(hMutex) в ThreadFunction и, вроде бы, все стало работать корректно. Все, всем спасибо за помощь.
|
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Корректно он все равно не работает - одного Mutex'а недостаточно. Сюда еще напрашивается семафор для сигнализации о новом значении time
Да и Lazin по поводу некорректного вызова Proverka тоже абсолютно прав. |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |