Запрет на запуск второго экземпляра, с коммуникацией между ними
April 7th, 2008 Begemot Posted in Uncategorized
Изолью душу:) Решил добавить сабж, думал все просто: копи\пайст с книжки, разобраться, подправить под себя, потестить – на час работы, максимум два. Растянулось на целый день:)
Скопировал, разобрался, подправил, тестю – все ок. Обрадовался, собрал себе релиз для внутреннего пользования - и тут засада. В релизе, при запуске второй копии, падает сервер. Дебаг, понятное дело затруднен… В итоге нашел падает на строчке.
return m_connection;
В wxConnectionBase *stServer::OnAcceptConnection(const wxString& topic). Вернее конечно не на ней, а после нее в дебрях библиотеки. Начал ковырятся, дошел до того что поведение программы, в смысле место падения, меняется в зависимости от того где определен конструктор в заголовочном файле или в cpp :). В итоге решил вообще отказатся от использования соединений для общения, просто если приходит от клиента попытка установить соединение, ему отказывать и серверу появлятся на экране. Так работало.
Но тут осенило, что трабла в то что, где-то что-то портило память – поэтому такое, более чем странное поведение программы. Решил рыть до конца. В итоге заметил, что в декларациях классов скопированных с книжки, после определения функций в пределах h файла ‘;’ то есть, то нет. Насколько я знаю это не критично, можно ставить можно нет. Решил поставить везде ‘;’ и чудо свершилось… с надеждой в душе, убрал их назад в небытие, но не помогло – программа все равно не падала. Вот и как это объяснить?
April 16th, 2008 at 10:34 pm
wxConnectionBase, OnAcceptConnection – единственный инстанс програмы – сервак, при запуске второго делаеться попытка установить конекшин – получилось – передаем сообщение и завершаемся?
а зачем так сложно с серваком? в винде обычная последовательность – первая запущеная програма регистрирует инстанс глобального обьекта(например мьютекс), при старте проверяем его существование, если находим – посылаем окну первого инстанса сообщние и выходим
April 17th, 2008 at 4:47 am
Ну я делал как в книжке было:) Запускаемся проверяем мютех, если нету делаем его и устанавливаем себя серваком. Второй экземляр проверяет мютех и общается с сервером. Не знаю почему именно так через сервер\клиент а не через сообщения окну, но в книжке именно так рекомендуют – возможно потому что окна могут быть разные?