как послать сообщение проге, у которой нет окна?
Есть консольная прога, в WinMain происходит вся обработка. Программулина весь ввод-вывод делает через файлы. Надо каким-то образом дать этой программе понять, когда завершиться, из другой программы. SendMessage для сабжа не подходит, так как нет окна. Можно, конечно, завести под это дело файл, и проверять его на изменение, но это как-то по-варварски. Может, у кого-нибудь есть идеи?
Глобальные объекты синхронизации: event. mutex и т.д.
Глобальные объекты синхронизации: 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.". А в консольной проге этот мутекс не отлавливается. Или, может быть, я что-то не так делал?
Я пробовал. Делал следующим образом.
В проге (обычной, с окнами и всеми прелестями), которая должна послать "сообщение" консольной проге, в момент, когда надо послать мессагу, выполняю
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}"
P.S. Необходимо обеспечить уникальность названия, т.к. объект глобальный для всей системы. Я использую для этого генератор GUID (как для COM), т.е. имя выглядит примерно так:
#define EVENT_NAME "Event_{B5347C70-15C8-4b93-BDF2-3B1E51AED75F}"
Кста, а какая программулина выдает guid'ы?
Что бы узнать как называется класс запусти WinSidht и найди там свой ехе и увидишь название класса - вот по нему и посылай сообщение
Во первых для получения сообщения не нужно окна - когда запускается ЕХЕ то все сообщения шлются главному классу этого ЕХЕ
Что бы узнать как называется класс запусти WinSidht и найди там свой ехе и увидишь название класса - вот по нему и посылай сообщение
"главному классу этого ЕХЕ" - это что-то новое в программировании под Windows? :D :D
Кста, а какая программулина выдает guid'ы?
Не знаю, как называется программа поставляемая с Builder-ом, а в комплекте MS VisualStudio есть программка Guidgen.exe (~25kB)