понедельник, 7 апреля 2008 г.

Запрет на запуск второго экземпляра, с коммуникацией между ними

Изолью душу:) Решил добавить сабж, думал все просто: копи\пайст с книжки, разобраться, подправить под себя, потестить - на час работы, максимум два. Растянулось на целый день:)

Скопировал, разобрался, подправил, тестю - все ок. Обрадовался, собрал себе релиз для внутреннего пользования -  и тут засада. В релизе, при запуске второй копии, падает сервер. Дебаг, понятное дело затруднен... В итоге нашел падает на строчке.

return m_connection;

В wxConnectionBase *stServer::OnAcceptConnection(const wxString& topic). Вернее конечно не на ней, а после нее в дебрях библиотеки. Начал ковырятся, дошел до того что поведение программы, в смысле место падения, меняется в зависимости от того где определен конструктор в заголовочном файле или в cpp :).  В итоге решил вообще отказатся от использования соединений для общения, просто если приходит от клиента попытка установить соединение, ему отказывать и серверу появлятся на экране. Так работало.

Но тут осенило, что трабла в то что, где-то что-то портило память - поэтому такое, более чем странное поведение программы. Решил рыть до конца. В итоге заметил, что в декларациях классов скопированных с книжки, после определения функций в пределах h файла ';' то есть, то нет. Насколько я знаю это не критично, можно ставить можно нет. Решил поставить везде ';' и чудо свершилось... с надеждой в душе, убрал их назад в небытие, но не помогло - программа все равно не падала. Вот и как это объяснить?

2 комментария:

Толік комментирует...

wxConnectionBase, OnAcceptConnection - единственный инстанс програмы - сервак, при запуске второго делаеться попытка установить конекшин - получилось - передаем сообщение и завершаемся?
а зачем так сложно с серваком? в винде обычная последовательность - первая запущеная програма регистрирует инстанс глобального обьекта(например мьютекс), при старте проверяем его существование, если находим - посылаем окну первого инстанса сообщние и выходим

Begemot комментирует...

Ну я делал как в книжке было:) Запускаемся проверяем мютех, если нету делаем его и устанавливаем себя серваком. Второй экземляр проверяет мютех и общается с сервером. Не знаю почему именно так через сервер\клиент а не через сообщения окну, но в книжке именно так рекомендуют - возможно потому что окна могут быть разные?