Понадобилось тут лабы выполнить по учебе, наконец то можно блеснуть знаниями о замечательной либе wxWidgets . В лабе один из пунктов задания: использования мьютексов для запуска одной копии программы. Полез в доку нашел эти мьютексы, объявил глобально в хидере:
-------------- Build: Release in test2 ---------------
Linking executable: bin\Release\test2.exe
obj\Release\test2Main.o:test2Main.cpp:(.bss+0x78): multiple definition of `_myflag1'
obj\Release\test2App.o:test2App.cpp:(.bss+0x4): first defined here
collect2: ld returned 1 exit status
Process terminated with status 1 (0 minutes, 0 seconds)
0 errors, 0 warnings
win xp sp2; CodeBlocks/mingw/wxWidgets 2.8.9/wxFormBuilder
web-программирование:PHP,js/Ajax
Переменная wxMutex myflag1 обявлена в заголовочном файле и включается в два cpp файла - test2Main.cpp и test2App.cpp. Из-за этого появляются ошибки в линковке.
Что бы этого избежать в заголовочном файле нобходимо написать:
Но мютексы лучше не использовать для проверки на запуск одного экземпляра приложения, поскольку другой пользователь может злоумышленно создать мютекс с таким же именем и приложение не запустится ни разу. Лучше в таких случаях создавать файл в temp каталоге пользователя и блокировать его.
Мютекс должен лочится на все время работы приложения, а не только на время инициализации, т.е. wxMutexLocker должен быть в методе OnRun(), а не OnInit().
Вызывать метод TryLock второй раз не надо, поскольку это делает wxMutexLocker
И самая главная проблема в том, что в каждом запущенном приложении должен быть один и тот же мютекс. В данном случае создаются каждый раз при запуске новые мютексы и обойти это можно использованием именованых мютексов. А они есть не на всех платформах, если я правильно понимаю, и соответственно нет в wxWidgets. Но можно выковырять мютекс wxMutexInternal из под wxMSW и использовать его: http://svn.wxwidgets.org/svn/wx/wxWidge ... thread.cpp
Здесь надо придумать и передать придуманное имя в третий параметр ::CreateMutex
Который использует мютексы под виндой для проверки на запуск одного экземпляра приложения. Под юниксами он использует правильный путь блокировки файла в домашнем каталоге.
Если там еще покопатся, то можно найти много чего интерестного .