Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 2
Регистрация: 08.07.2009
Сообщений: 3

Mutex не приостанавливает поток

26.04.2010, 16:52. Показов 2314. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Мне нужно написать такую программу:
1) Когда выбирается пункт меню "Новое окно", создается новое окно.
2) Когда выбирается пункт меню "Открыть", открывается на чтение файл и в окне показывается содержимое файла.
3) Если выбрать пункт меню "Открыть", когда в другом окне показано содержимое файла, нужно написать в окне: "Подождите..." и приостановить выполнение пока в другом окне файл не будет закрыт.
4) Когда выбирается пункт меню "Закрыть", нужно закрыть файл, а в другом окне продолжить показывать файл.
Приостановка показа реализовывается с помощью объекта Mutex.

Проблема в том, что при втором выполнении: WaitForSingleObject(hMutex, INFINITE); поток не ждет освобождения Mutex'а.

В сообщении WM_CREATE я создаю Mutex:
C++
1
2
3
4
5
case WM_CREATE:
    {
        hMutex=CreateMutex(NULL, FALSE, NULL);
    }
    break;
Я открываю и закрываю файлы в потоках.
При выборе пункта меню я создаю потоки, в параметре я передаю им адрес структуры с HWND Edit'а(В котором будет показано содержимое файла) и wfstream File. (У каждого окна есть свой экзэмпляр этой структуры).
Вот что делают эти потоки.
Поток отсрытия файла:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
DWORD WINAPI ReadThread(LPVOID lpVoid)
{
    LPMYWNDINFO MyInfo=(LPMYWNDINFO)lpVoid;
    SetWindowText(MyInfo->hEdit1, L"Wait...");
    WaitForSingleObject(hMutex, INFINITE);
    MyInfo->File.open(L"file.txt", ios::in);
    if(!MyInfo->File)
    {
        MyInfo->File.clear();
        MyInfo->File.open(L"file.txt", ios::out);
        MyInfo->File<<L"Hello world";
        MyInfo->File.close();
        MyInfo->File.open(L"file.txt", ios::in);
    }
    TCHAR Txt[256]={};
    MyInfo->File.getline(Txt, 256);
    SetWindowText(MyInfo->hEdit1, Txt);
    return 0;
}
LPMYWNDINFO - это указатель на мою структуру:
C++
1
2
3
4
typedef struct _MYWNDINFO{
    HWND hEdit1;
    wfstream File;
} MYWNDINFO, *LPMYWNDINFO;
Сначала я пишу в Edit'е "Wait...".
Потом я вызываю функцию WaitForSingleObject. При первом выполнении она захватывает Mutex, а при последующих должна останавливать выполнение потока до выполнения потока закрытия файла.
Затем она открывает файл, а если он не существует, то создает его.
Потом в строку Txt считывается содержимое файла и "вставляется" в Edit.

Поток закрытия файла:
C++
1
2
3
4
5
6
7
8
9
DWORD WINAPI CloseThread(LPVOID lpVoid)
{
    LPMYWNDINFO MyInfo=(LPMYWNDINFO)lpVoid;
    MyInfo->File.close();
    MyInfo->File.clear();
    SetWindowText(MyInfo->hEdit1, L"Closed.");
    ReleaseMutex(hMutex);
    return NULL;
}
Здесь сначала закрывается файл, а потом очищается Edit и освобождается Mutex.

Если нужно, я могу выложить полный код.
Заранее благодарен.

Добавлено через 17 часов 15 минут
Проблема решена. Причина в том, что захват и освобождение Mutex'а нужно делать в одном потоке.
Управление мьютексом не может быть разделено между потоками,
т.е. нельзя в одном потоке захватить этот объект, а в другом - освободить,
т.к. привязка тут идет именно к контексту потока.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.04.2010, 16:52
Ответы с готовыми решениями:

Mutex - Возможно ли создать новый поток для участка кода
То есть новый поток можно создать лишь через новую функцию ? А возможно ли создать новый поток для участка кода ? Добавлено через...

Как быть, если поток std::mutex в вечном цикле лочится на все содержимое?
привет. работаю с многозадачностью. заюзал sleep, т.к без него на данном потоке mutex просто зависнет, но sleep вроде как не кошерно, но и...

Метод Show приостанавливает выполнение макроса
Метод UserForm1.Showприостанавливает выполнение макроса, как этого избежать?

2
 Аватар для snake32
3516 / 1699 / 236
Регистрация: 26.02.2009
Сообщений: 8,537
Записей в блоге: 6
26.04.2010, 21:17
Цитата Сообщение от terazoid Посмотреть сообщение
Управление мьютексом не может быть разделено между потоками,
Какбэ можно даже между разными процессами, для этого есть именнованные мьютексы. Последний параметр в CreateMutex и OpenMutex.
0
0 / 0 / 2
Регистрация: 08.07.2009
Сообщений: 3
27.04.2010, 00:04  [ТС]
Я имею ввиду, что нельзя в одном потоке захватить мьютекс, а в другом освободить его.
C++
1
2
3
4
5
DWORD T1(LPVOID lpParam)
{
  WaitForSingleObject(hMutex, INFINITE);
  return 0;
}
C++
1
2
3
4
5
DWORD T2(LPVOID lpParam)
{
  ReleaseMutex(hMutex);
  return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.04.2010, 00:04
Помогаю со студенческими работами здесь

YouTube самопроизвольно приостанавливает воспроизведение видео
Доброго времени суток, уважаемые форумчане! Столкнулся с проблемой, указанной в заголовке. Примерно после 25 минут останавливается...

Метод Form.ShowDialog() не приостанавливает работу потока
Метод Form.ShowDialog() интересен для меня тем, что при его вызове в коде программа останавливается на этом методе и не идет по строкам,...

Fgets не приостанавливает программу, если перед ним cin
Почему после cin (конкретно после ввода, когда дошел до fgets) не приостанавливается программа? Проскакивает, будто пользователь уже что-то...

Поток освобождается, но переменная, которой был присвоен этот поток, не очищается
Мне интересно, вот поток отработал, стоит FreeOnTerminate:=True; Поток освобождается, но переменной которой было присвоен этот поток, не...

Создал поток. В нем выделил буффер. Поток выполнился, но из за буфера ругнулся.
В функции треда создал буфер char tbuf;но после того как тред выполнился выскочила ошибка Run-Time Check Failure #2 - Stack around the...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru