Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование с использованием WinAPI

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

Открыть новую тему     Написать ответ в эту тему

wasilissk

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
V0lt
bInitialOwner если True, то мутекс захватывается создавшим его потоком сразу после создания. До тех пор пока не будет вызван ReleaseMutex.
bInheritHandle стандартный апишный флаг, разрешающий наследовать хендлы в дочерних процессах.

Всего записей: 293 | Зарегистр. 25-12-2006 | Отправлено: 07:49 25-10-2011
V0lt



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
bInitialOwner если True, то мутекс захватывается создавшим его потоком сразу после создания. До тех пор пока не будет вызван ReleaseMutex.

Мне непонятен термин "захватывается".
 

Цитата:
bInheritHandle стандартный апишный флаг, разрешающий наследовать хендлы в дочерних процессах.

Что значит "наследовать"? Мутекс же один.
У меня куча процессов, которые запускаются из проводника. Первый будет создавать мутекс, остальные будут его проверять через OpenMutex. В данном случае, есть смысл в параметре bInheritHandle или нет?

Всего записей: 10483 | Зарегистр. 05-02-2003 | Отправлено: 19:53 25-10-2011
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
V0lt

Цитата:
Мне непонятен термин "захватывается".

Почитай про принципы синхронизации в Win.

Цитата:
Первый будет создавать мутекс, остальные будут его проверять через OpenMutex.

Достаточно CreateMutex и проверить код возврата GetLastError. Если получил ERROR_ALREADY_EXISTS или ERROR_ACCESS_DENIED - значит, мьютекс уже был создан.

Цитата:
В данном случае, есть смысл в параметре bInheritHandle или нет?

Нет.

----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6079 | Зарегистр. 22-10-2005 | Отправлено: 20:46 25-10-2011
wasilissk

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
V0lt

Цитата:
Мне непонятен термин "захватывается".

Abs62 опередил, еще прикольное описание у Рихтера, через туалет на самолете.

Цитата:
Что значит "наследовать"? Мутекс же один.

Наследовать хендл мутекса. Обычно хендл валиден в рамках одного процесса, если установить bInheritHandle в True, то его можно будет использовать в дочерних процессах.

Цитата:
В данном случае, есть смысл в параметре bInheritHandle или нет?

В случае именованного мутекса нет, в случае неименованного - имеет.

Всего записей: 293 | Зарегистр. 25-12-2006 | Отправлено: 20:55 25-10-2011
V0lt



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Достаточно CreateMutex и проверить код возврата GetLastError. Если получил ERROR_ALREADY_EXISTS или ERROR_ACCESS_DENIED - значит, мьютекс уже был создан.

Когда я использую CreateMutex, то поиск в ProcessExplorer выдает количество результатов равное количеству процессов. Если для первого процесса сделать CreateMutex, а для остальных OpenMutex, то ProcessExplorer выдаст только один результат.
 
Где-то читал, что CreateMutex пытается сначала открыть мутекс, и если потерпит неудачу, тогда создаст его. Т.е. если мутекс уже существует, то CreateMutex = OpenMutex, но на практике совсем не так.
 
Как бы получается, что OpenMutex ничего не открывает, а всего лишь проверяет наличие (есть или нет можно узнать через GetLastError). Оно конечно хорошо (мне как раз нужна функция, которая будет лишь проверять наличие мутекса), но ведь хрень какая-то получается.
 
PS: экспериментирую с ATL::CMutex
 
Добавлено:
Вот кусок кода (не Я придумал )

Код:
ATL::CMutex m_mutexOneInstance;
...
m_mutexOneInstance.Create(NULL, TRUE, MPC_WND_CLASS_NAME);
if (GetLastError() == ERROR_ALREADY_EXISTS && ...) {
...
}

Больше мутекс никак не используется. Мои тесты показали, что от значения bInitialOwner ничего не зависит. Или я чего-то упустил?

Всего записей: 10483 | Зарегистр. 05-02-2003 | Отправлено: 21:15 25-10-2011 | Исправлено: V0lt, 21:16 25-10-2011
Sota

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
V0lt
Если english не пугает то можно сделать так:
http://bcbjournal.org/articles/vol3/9911/Single-instance_applications.htm
 
Таки мьютекс нужен, ибо в Win32 в WinMain самый нужный параметр hPrevInstance равен NULL.
 
В итоге имеем:
1. Пробуем создать мьтекс.
2. Если создалося, то мы самая первая инстанс приложения, запускаемся и работаем (мьютекс держим до завершения).
3. Если нет, то ищем окно (в примере как раз окно)  
3.1 И если найдем, то скидываем ему файл для обработки.
3.2 И заканчиваем.
4. Мы первый инстанс, обработаем все что нам накидали.
 
Другой вопрос что будет когда не найдем окна?
 
Нут тут можно поспать миллисекунд 1000 и еще раз поискать попробовать.

Всего записей: 273 | Зарегистр. 19-12-2005 | Отправлено: 22:03 25-10-2011
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
V0lt

Цитата:
Вот кусок кода (не Я придумал )

Так может дело не в мьютексе, а в том, что после идёт?
Кстати, там тоже этот мьютекс пригодиться может. Например, можно захватывать его при создании, а освобождать после создания главного окна (в обработчике WM_CREATE, скажем). А когда GetLastError вернёт ERROR_ALREADY_EXISTS, ждать освобождения через WaitForSingleObject и только после этого начинать искать окно. Тогда не будет этой угадайки - то ли окна ещё нет, то ли его уже нет.
 
Кстати, мне кажется, что лучше вынести CreateMutex к самому началу программы. Идеально, чтобы это вообще было первым её действием. Тогда от момента запуска до момента создания окна мьютекс будет занят.

----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6079 | Зарегистр. 22-10-2005 | Отправлено: 23:10 25-10-2011 | Исправлено: Abs62, 23:47 25-10-2011
V0lt



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sota
Очень хорошая статья, спасибо.
 
Abs62

Цитата:
Кстати, там тоже этот мьютекс пригодиться может. Например, можно захватывать его при создании, а освобождать после создания главного окна (в обработчике WM_CREATE, скажем).

Захватить/освободить - это Attach/Detach? А как потом проверить, что мютекс есть или его нет, и если есть, то он захвачен или освобожден?

Всего записей: 10483 | Зарегистр. 05-02-2003 | Отправлено: 06:49 26-10-2011
wasilissk

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
V0lt

Цитата:
Захватить/освободить - это Attach/Detach?

WaitForSingleObject например или опять же параметр bInitialOwner. Вы статью прочитали на которую Abs62 ссылку давал? Что там может не получиться не понятно. Может стоит сначала на чистом API попробовать, прежде чем ATL использовать?

Всего записей: 293 | Зарегистр. 25-12-2006 | Отправлено: 07:48 26-10-2011
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
V0lt
Первоначально захватить через bInitialOwner, освободить в обработчике WM_CREATE. А во втором экземпляре ждать освобождения.

Код:
m_mutexOneInstance.Create(NULL, TRUE, MPC_WND_CLASS_NAME);
if (GetLastError() == ERROR_ALREADY_EXISTS) {
  DWORD res=WaitForSingleObject(m_mutexOneInstance.HANDLE(),10000); //Таймаут лучше выставить с запасом
  if(res==WAIT_OBJECT_0 || res==WAIT_ABANDONED) {
    //Тут уже можно проверять наличие окна. Если его нет, то уже и не будет.
    ...
    m_mutexOneInstance.Release(); //Надо освободить захваченный мьютекс, дабы остальным экземплярам дать поработать
  } else {
     //Что-то пошло через задницу
  }
}


----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6079 | Зарегистр. 22-10-2005 | Отправлено: 09:21 26-10-2011 | Исправлено: Abs62, 09:23 26-10-2011
V0lt



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
wasilissk, Abs62
Понемногу начинаю въезжать, пробный вариант даже работает . Есть немного смутное понимание WAIT_ABANDONED, это ведь когда процесс случайно убился?
 
 
Во многих аудиоплеерах если открыть из проводника несколько файлов, то они все добавятся в плейлист. Но если открывать те же файлы по одному, то в плейлисте будет только один из файлов. Как такое делается? Время меряют или есть способы по-лучше?
 
Добавлено:
В общем MPC такое умеет. Меряет время.

Код:
if (last_run && ((GetTickCount()-last_run)<500)) {
    s.nCLSwitches |= CLSW_ADD;
}
last_run = GetTickCount();

Всего записей: 10483 | Зарегистр. 05-02-2003 | Отправлено: 23:21 26-10-2011 | Исправлено: V0lt, 00:18 27-10-2011
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
V0lt

Цитата:
Есть немного смутное понимание WAIT_ABANDONED, это ведь когда процесс случайно убился?

Ну да. Точнее, когда поток завершился, а мьютекс перед этим не освободил. Обычно такое случается именно при падении.


----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6079 | Зарегистр. 22-10-2005 | Отправлено: 23:38 26-10-2011
DmitryKz

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Не знаю наверняка, по теме ли мои вопросы, но рискну задать здесь:
1. Скажите, пожалуйста, как определить, используется ли Aero в данный момент?
2. Windows 7 при использовании некоторых программ переключает оформление из Aero в Basic, якобы из-за проблем совместимости. Тем не менее, мои наблюдения показывают, что некоторый софт отлично работает и в Aero, а иногда это даже может дать дополнительное удобство (был один такой случай).
Как можно предотвратить переключение оформления?
Можно, конечно, перезапустить службу UxSms, как я и делал раньше, но всё это ценой дополнительного мелькания, которое, вообще-то, не нужно.
Я так понимаю, что у оси есть либо какая-то БД, где хранится список приложений, либо у самого приложения где-то прописано, что необходимо переключение оформления.
Есть ли у кого-либо какие-либо соображения по этому поводу? То есть задача не избавиться от переключения оформления вообще, а только в случае конкретного приложения.

Всего записей: 3142 | Зарегистр. 29-09-2005 | Отправлено: 15:00 02-11-2011
Molniev

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DmitryKz,
1. Функция DwmIsCompositionEnabled не то, что вы ищете?
И "какие-либо соображения по этому поводу":
2. А если эта программа вызовет DwmEnableComposition? Но вроде как композитный рабочий стол отключаеться только при использовании старого api (+список совместимости программ +чекбокс в свойствах>совместимость), поэтому если выключается - то уже не включиться.

Всего записей: 176 | Зарегистр. 13-03-2008 | Отправлено: 20:36 02-11-2011
ItsJustMe

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Я так понимаю, что у оси есть либо какая-то БД, где хранится список приложений, либо у самого приложения где-то прописано, что необходимо переключение оформления.  

Все проще - переключение происходит, если прога использует API, не совместимый с композитным десктопом. Обычно это интерфейсы DX.

Всего записей: 2028 | Зарегистр. 02-09-2005 | Отправлено: 14:30 03-11-2011
V0lt



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Давно хотел спросить. Как поменять цвет фона и текста у контекстного меню?

Всего записей: 10483 | Зарегистр. 05-02-2003 | Отправлено: 06:49 12-12-2011
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
V0lt
Либо на уровне винды через цветовые схемы (глобально для всех менюшек), либо для своего приложения для своего меню через собственную отрисовку пунктов - WM_DRAWITEM, WM_MEASUREITEM и естессно пункты меню должны быть owner_draw.


----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 08:26 12-12-2011
V0lt



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt

Цитата:
либо для своего приложения для своего меню через собственную отрисовку пунктов - WM_DRAWITEM, WM_MEASUREITEM и естессно пункты меню должны быть owner_draw.  

Чего-то перемудрено только ради смены цвета. Хорошие примеры в инете встречаются?

Всего записей: 10483 | Зарегистр. 05-02-2003 | Отправлено: 18:52 12-12-2011
Garrett

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
V0lt
Посмотрите на codeproject'e.

Всего записей: 2735 | Зарегистр. 16-10-2003 | Отправлено: 19:16 12-12-2011
DmitryKz

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите по такому вопросу:
есть функция GetOpenFileName, есть хук-процедура - как в хук-процедуре принудительно открывать другие директории? У меня в диалоговом окне пара радио-кнопок, по выбору которых должны открываться определенные директории (чтобы пользователя не заставлять щелкать многажды)..
Прочитал главу в MSDN Open and Save As Dialog Boxes, но информация там не касается этого момента, а каких-либо отсылок в нужном направлении не увидел...

Всего записей: 3142 | Зарегистр. 29-09-2005 | Отправлено: 12:13 26-12-2011 | Исправлено: DmitryKz, 12:14 26-12-2011
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование с использованием WinAPI


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru