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

April 7th, 2008 Begemot Posted in Uncategorized

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

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

return m_connection;

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

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

Related:

Posted in Uncategorized | Tags:

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

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

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