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

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

26.04.2010, 16:52. Показов 2303. Ответов 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
3510 / 1693 / 236
Регистрация: 26.02.2009
Сообщений: 8,438
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru