Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.04.2010, 23:03   #1
Terazoid
 
Регистрация: 09.06.2009
Сообщений: 9
По умолчанию Не работает Mutex (MDI приложение)

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

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

В сообщении WM_CREATE я создаю Mutex:
Код:
case WM_CREATE:
	{
		hMutex=CreateMutex(NULL, FALSE, NULL);
	}
	break;
Я открываю и закрываю файлы в потоках.
При выборе пункта меню я создаю потоки, в параметре я передаю им адрес структуры с HWND Edit'а(В котором будет показано содержимое файла) и wfstream File. (У каждого окна есть свой экзэмпляр этой структуры).
Вот что делают эти потоки.
Поток отсрытия файла:
Код:
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 - это указатель на мою структуру:
Код:
typedef struct _MYWNDINFO{
	HWND hEdit1;
	wfstream File;
} MYWNDINFO, *LPMYWNDINFO;
Сначала я пишу в Edit'е "Wait...".
Потом я вызываю функцию WaitForSingleObject. При первом выполнении она захватывает Mutex, а при последующих должна останавливать выполнение потока до выполнения потока закрытия файла.
Затем она открывает файл, а если он не существует, то создает его.
Потом в строку Txt считывается содержимое файла и "вставляется" в Edit.

Поток закрытия файла:
Код:
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.

Если нужно, я могу выложить полный код.
Заранее благодарен.
Terazoid вне форума Ответить с цитированием
Старый 26.04.2010, 16:53   #2
Terazoid
 
Регистрация: 09.06.2009
Сообщений: 9
По умолчанию

Проблема решена. Причина в том, что захват и освобождение Mutex'а нужно делать в одном потоке.
Цитата:
Управление мьютексом не может быть разделено между потоками,
т.е. нельзя в одном потоке захватить этот объект, а в другом - освободить,
т.к. привязка тут идет именно к контексту потока.
Terazoid вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача параметра с MDI родителя в MDI child через DLL ByXalkin Общие вопросы Delphi 0 15.12.2009 17:21
Задача:в вижуал с++ Разработать приложение-сервер и приложение (смотри дальше сообщение) Мила777 Фриланс 2 21.10.2009 11:05
mdi приложение Михаил Юрьевич Общие вопросы Delphi 1 21.09.2009 01:01
MDI-приложение Технолог Общие вопросы Delphi 6 02.05.2008 20:10
MDI приложение Arsgun Общие вопросы Delphi 4 29.05.2007 12:36