Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

как послать сообщение проге, у которой нет окна?

463
09 июля 2003 года
waterman
178 / / 17.01.2003
Есть консольная прога, в WinMain происходит вся обработка. Программулина весь ввод-вывод делает через файлы. Надо каким-то образом дать этой программе понять, когда завершиться, из другой программы. SendMessage для сабжа не подходит, так как нет окна. Можно, конечно, завести под это дело файл, и проверять его на изменение, но это как-то по-варварски. Может, у кого-нибудь есть идеи?
3
09 июля 2003 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by waterman
Есть консольная прога, в WinMain происходит вся обработка. Программулина весь ввод-вывод делает через файлы. Надо каким-то образом дать этой программе понять, когда завершиться, из другой программы. SendMessage для сабжа не подходит, так как нет окна. Можно, конечно, завести под это дело файл, и проверять его на изменение, но это как-то по-варварски. Может, у кого-нибудь есть идеи?



Глобальные объекты синхронизации: event. mutex и т.д.

463
10 июля 2003 года
waterman
178 / / 17.01.2003
Цитата:
Originally posted by Green


Глобальные объекты синхронизации: event. mutex и т.д.



Я пробовал. Делал следующим образом.

В проге (обычной, с окнами и всеми прелестями), которая должна послать "сообщение" консольной проге, в момент, когда надо послать мессагу, выполняю

HANDLE h = CreateMutex(MUTEX_ALL_ACCESS, FALSE, "get traj");
ShowMessage("Mutex created.");

В консольной проге, которая должна получить "сообщение", ждал появления мутекса:

while(!OpenMutex(MUTEX_ALL_ACCESS, FALSE, "get traj"));
ShowMessage("Mutex got");

Так вот. В первом случае мутекс создается, вылезает окно "Mutex created.". А в консольной проге этот мутекс не отлавливается. Или, может быть, я что-то не так делал?

3
10 июля 2003 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by waterman


Я пробовал. Делал следующим образом.

В проге (обычной, с окнами и всеми прелестями), которая должна послать "сообщение" консольной проге, в момент, когда надо послать мессагу, выполняю

HANDLE h = CreateMutex(MUTEX_ALL_ACCESS, FALSE, "get traj");
ShowMessage("Mutex created.");

В консольной проге, которая должна получить "сообщение", ждал появления мутекса:

while(!OpenMutex(MUTEX_ALL_ACCESS, FALSE, "get traj"));
ShowMessage("Mutex got");

Так вот. В первом случае мутекс создается, вылезает окно "Mutex created.". А в консольной проге этот мутекс не отлавливается. Или, может быть, я что-то не так делал?



Объект открывается в обоих процессах, точнее один создает, а другой открывает. После этого происходит работа с этим объектом. Для мьютекса работа заключается в его захвате, освобождении и ожидании освобождения с последующим захватом. В твоем случае лучше использовать событие (Event), т.к. он позволяет установку его в сигнальное состояние одним процессом и ожидание этой установки другим процессом.

Создание и установка в сигнальное состояние:

hEvent = CreateEventA(NULL, TRUE, FALSE, EVENT_NAME);
SetEvent(hEvent);

Создание (открытие) и ожидание сигнального состояния:

hEvent = CreateEventA(NULL, TRUE, FALSE, EVENT_NAME);
if(WAIT_OBJECT_0 == WaitForSingleObject(hEvent,INFINITE))
{
......
}

Проверки и т.п. упустил.
Время ожидания устанавливается вторым параметром, при этом INFINITE - неограниченное время, т.е. пока не установиться сигнальное состояние поток из процедуры ожидания не выйдет; 0 - проверить и сразу вфйти без ожидания.

Более подробно в MSDN.

P.S. Необходимо обеспечить уникальность названия, т.к. объект глобальный для всей системы. Я использую для этого генератор GUID (как для COM), т.е. имя выглядит примерно так:

#define EVENT_NAME "Event_{B5347C70-15C8-4b93-BDF2-3B1E51AED75F}"

463
10 июля 2003 года
waterman
178 / / 17.01.2003
Спасибо!
463
12 июля 2003 года
waterman
178 / / 17.01.2003
Цитата:
Originally posted by Green

P.S. Необходимо обеспечить уникальность названия, т.к. объект глобальный для всей системы. Я использую для этого генератор GUID (как для COM), т.е. имя выглядит примерно так:

#define EVENT_NAME "Event_{B5347C70-15C8-4b93-BDF2-3B1E51AED75F}"



Кста, а какая программулина выдает guid'ы?

293
13 июля 2003 года
SEDEGOFF
586 / / 06.10.2002
Во первых для получения сообщения не нужно окна - когда запускается ЕХЕ то все сообщения шлются главному классу этого ЕХЕ
Что бы узнать как называется класс запусти WinSidht и найди там свой ехе и увидишь название класса - вот по нему и посылай сообщение
3
13 июля 2003 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by SEDEGOFF
Во первых для получения сообщения не нужно окна - когда запускается ЕХЕ то все сообщения шлются главному классу этого ЕХЕ
Что бы узнать как называется класс запусти WinSidht и найди там свой ехе и увидишь название класса - вот по нему и посылай сообщение



"главному классу этого ЕХЕ" - это что-то новое в программировании под Windows? :D :D

Цитата:
Originally posted by SEDEGOFF

Кста, а какая программулина выдает guid'ы?



Не знаю, как называется программа поставляемая с Builder-ом, а в комплекте MS VisualStudio есть программка Guidgen.exe (~25kB)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог