Russian Qt Forum

Qt => Дополнительные компоненты => Тема начата: ритт от Май 15, 2008, 02:51



Название: SingleApplication (qt4.4)
Отправлено: ритт от Май 15, 2008, 02:51
http://www.qt-apps.org/content/show.php/SingleApplication?content=81163

SingleApplication - компонента, схожая по функционалу с коммерческим солюшеном QtSingleApplication.

просьба потестировать на разных платформах/компиляторах


Название: Re: SingleApplication (qt4.4)
Отправлено: Пантер от Май 15, 2008, 11:29
Код:
g++ -Wl,-rpath,/opt/qt/4.4.0/lib -o ../../singleapplication-0.1/example main.o widget.o moc_widget.o moc_singleapplication.o    -L/opt/qt/4.4.0//lib -L/mnt/other/tmp/singleapplication-0.1 -lsingleapplication -lQtGui -L/opt/qt/4.4.0//lib -L/usr/X11R6/lib -lpng -lSM -lICE -pthread -pthread -lXi -lXrender -lXrandr -lfreetype -lfontconfig -lXext -lX11 -lQtNetwork -pthread -pthread -lQtCore -lz -lm -pthread -lgthread-2.0 -lrt -lglib-2.0 -lpthread -ldl
/usr/lib/gcc/i486-slackware-linux/4.1.2/../../../../i486-slackware-linux/bin/ld: cannot open output file ../../singleapplication-0.1/example: Is a directory
collect2: выполнение ld завершилось с кодом возврата 1
make: *** [../../singleapplication-0.1/example] Ошибка 1


Название: Re: SingleApplication (qt4.4)
Отправлено: ритт от Май 15, 2008, 19:14
чёрт...надо бросать писать что-либо со спичками в глазах :)
изменил таргет для экзампла


Название: Re: SingleApplication (qt4.4)
Отправлено: Mikhail от Май 16, 2008, 07:41
Windows/qt440/MSVC 2008

Работает


Название: Re: SingleApplication (qt4.4)
Отправлено: uriel от Май 16, 2008, 13:07
ArchLinux, Gcc 4.3.0, Qt 4.4.0 - тоже работает. :)


Название: Re: SingleApplication (qt4.4)
Отправлено: ритт от Май 16, 2008, 14:01
благодарствую
ещё бы для 95/98/висты и для макоси узнать работоспособность...но это уже так - опция (на 95/98 я никогда возвращаться не стану, на висту - никогда не буду, а на маке сокеты работают ничуть не хуже, чем на большинстве линухов - это у вендов проблемы от версии к версии)

кстати, если кого компонента заинтересовала, пожелания и критика приветствуются - буду под видом хобби поддерживать подобные мелкие подпроекты


Название: Re: SingleApplication (qt4.4)
Отправлено: Mikhail от Май 16, 2008, 16:20
благодарствую
ещё бы для 95/98/висты и для макоси узнать работоспособность...но это уже так - опция (на 95/98 я никогда возвращаться не стану, на висту - никогда не буду, а на маке сокеты работают ничуть не хуже, чем на большинстве линухов - это у вендов проблемы от версии к версии)

кстати, если кого компонента заинтересовала, пожелания и критика приветствуются - буду под видом хобби поддерживать подобные мелкие подпроекты

Qt 4.4 компилируется MSVC2005 и не ниже, а также под MINGW.
Не уверен, что MSVC2005 установится на 95/98. Если это так, то ...


Название: Re: SingleApplication (qt4.4)
Отправлено: Пантер от Май 16, 2008, 16:32
Ну наконец-то скомпилил. :) Под Слакой работает отлично.
благодарствую
ещё бы для 95/98/висты и для макоси узнать работоспособность...но это уже так - опция (на 95/98 я никогда возвращаться не стану, на висту - никогда не буду, а на маке сокеты работают ничуть не хуже, чем на большинстве линухов - это у вендов проблемы от версии к версии)

кстати, если кого компонента заинтересовала, пожелания и критика приветствуются - буду под видом хобби поддерживать подобные мелкие подпроекты

Qt 4.4 компилируется MSVC2005 и не ниже, а также под MINGW.
Не уверен, что MSVC2005 установится на 95/98. Если это так, то ...
1. А что мешает MinGW использовать?
2. А разве нельзя скомпилить под XP и потестить под 95-98? ;)


Название: Re: SingleApplication (qt4.4)
Отправлено: ритт от Май 16, 2008, 17:06
> А разве нельзя скомпилить под XP и потестить под 95-98?
можно-то, конечно, можно...только где её взять, эту самую? :)


Название: Re: SingleApplication (qt4.4)
Отправлено: Пантер от Май 16, 2008, 17:27
Кого? ХР? Могу скинуть. ;)


Название: Re: SingleApplication (qt4.4)
Отправлено: IGHOR от Июнь 07, 2008, 15:20
Добавил в проект и получаю ошибку
Код:
1>------ Build started: Project: JulyView, Configuration: Release Win32 ------
1>Moc'ing singleapplication.h...
1>RCC julyview.qrc
1>MOC julyview.h
1>Compiling...
1>qrc_julyview.cpp
1>moc_julyview.cpp
1>main.cpp
1>julyview.cpp
1>Generating Code...
1>Compiling...
1>moc_singleapplication.cpp
1>Linking...
1>main.obj : error LNK2019: unresolved external symbol "public: virtual __thiscall SingleApplication::~SingleApplication(void)" (??1SingleApplication@@UAE@XZ) referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol "public: bool __thiscall SingleApplication::sendMessage(class QString const &,int)" (?sendMessage@SingleApplication@@QAE_NABVQString@@H@Z) referenced in function _main
1>moc_singleapplication1.obj : error LNK2001: unresolved external symbol "public: bool __thiscall SingleApplication::sendMessage(class QString const &,int)" (?sendMessage@SingleApplication@@QAE_NABVQString@@H@Z)
1>main.obj : error LNK2019: unresolved external symbol "public: bool __thiscall SingleApplication::isRunning(void)const " (?isRunning@SingleApplication@@QBE_NXZ) referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol "public: __thiscall SingleApplication::SingleApplication(class QString const &,class QObject *)" (??0SingleApplication@@QAE@ABVQString@@PAVQObject@@@Z) referenced in function _main
1>release\JulyView.exe : fatal error LNK1120: 4 unresolved externals
1>Build log was saved at "file://c:\singleapplication-0.1\JulyView\release\BuildLog.htm"
1>JulyView - 6 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Причем example1 работает
что я не так делаю ?


Название: Re: SingleApplication (qt4.4)
Отправлено: pastor от Июнь 07, 2008, 15:34
А либу прилинковать в проект?


Название: Re: SingleApplication (qt4.4)
Отправлено: Sergeich от Июнь 07, 2008, 15:43
2 Константин:
Не хочешь лицензию поменять на что-нибудь вроде LGPL? :)


Название: Re: SingleApplication (qt4.4)
Отправлено: IGHOR от Июнь 07, 2008, 15:49
А либу прилинковать в проект?

может тупой вопрос,
но как ето сделать ?


Название: Re: SingleApplication (qt4.4)
Отправлено: Sergeich от Июнь 07, 2008, 16:33
include (singleapplication.pri)
в прошнике


Название: Re: SingleApplication (qt4.4)
Отправлено: IGHOR от Июнь 08, 2008, 00:02
include (singleapplication.pri)
в прошнике

сделал и теперь получаю:
Код:
1>------ Build started: Project: JulyView, Configuration: Release Win32 ------
1>RCC julyview.qrc
1>MOC singleapplication.h
1>MOC julyview.h
1>Compiling...
1>qrc_julyview.cpp
1>moc_singleapplication.cpp
1>.\Release\moc_singleapplication.cpp(47) : warning C4273: 'staticMetaObject' : inconsistent dll linkage
1>        c:\julyview\julyview\release\../singleapplication.h(33) : see previous definition of 'public: static QMetaObject const SingleApplication::staticMetaObject'
1>.\Release\moc_singleapplication.cpp(47) : error C2491: 'SingleApplication::staticMetaObject' : definition of dllimport static data member not allowed
1>.\Release\moc_singleapplication.cpp(53) : warning C4273: 'SingleApplication::metaObject' : inconsistent dll linkage
1>        c:\julyview\julyview\release\../singleapplication.h(33) : see previous definition of 'metaObject'
1>.\Release\moc_singleapplication.cpp(58) : warning C4273: 'SingleApplication::qt_metacast' : inconsistent dll linkage
1>        c:\julyview\julyview\release\../singleapplication.h(33) : see previous definition of 'qt_metacast'
1>.\Release\moc_singleapplication.cpp(66) : warning C4273: 'SingleApplication::qt_metacall' : inconsistent dll linkage
1>        c:\julyview\julyview\release\../singleapplication.h(33) : see previous definition of 'qt_metacall'
1>.\Release\moc_singleapplication.cpp(85) : warning C4273: 'SingleApplication::messageReceived' : inconsistent dll linkage
1>        c:\julyview\julyview\release\../singleapplication.h(41) : see previous definition of 'messageReceived'
1>moc_julyview.cpp
1>main.cpp
1>julyview.cpp
1>Generating Code...
1>Build log was saved at "file://c:\JulyView\JulyView\release\BuildLog.htm"
1>JulyView - 1 error(s), 5 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========


Название: Re: SingleApplication (qt4.4)
Отправлено: pastor от Июнь 08, 2008, 12:52
Попробывал скомпилить у себя. В проекте явно какой-то бок с макросами импорта\экспорта. Разбираться времени нет.

Shared: либа собралась, не собираеться экзампл
Static: собралась и либа и экзампл, но наблюдаеться излишний наворот. Получается example.exe + example.lib (последнее не есть правильно)

Qt 4.4.0, VS2005


Название: Re: SingleApplication (qt4.4)
Отправлено: IGHOR от Июнь 08, 2008, 16:56
Получилось поправить:

отредактировал singleapplication.h

блок

Код:
#ifdef Q_OS_WIN
# ifdef SINGLE_APPLICATION_DLL
# ifdef SINGLE_APPLICATION_BUILD_LIB
# define SINGLE_APPLICATION_EXPORT Q_DECL_EXPORT
# else
# define SINGLE_APPLICATION_EXPORT Q_DECL_IMPORT
# endif
# endif
#endif
#ifndef SINGLE_APPLICATION_EXPORT
# define SINGLE_APPLICATION_EXPORT
#endif

заменил на

Код:
#ifdef Q_OS_WIN
# ifdef SINGLE_APPLICATION_DLL
# ifndef SINGLE_APPLICATION_BUILD_LIB
# define SINGLE_APPLICATION_EXPORT Q_DECL_EXPORT
# else
# define SINGLE_APPLICATION_EXPORT Q_DECL_IMPORT
# endif
# endif
#endif
#ifndef SINGLE_APPLICATION_EXPORT
# define SINGLE_APPLICATION_EXPORT
#endif

и теперь все работает


Название: Re: SingleApplication (qt4.4)
Отправлено: pastor от Июнь 09, 2008, 00:37
Эта поправка не есть правильной


Название: Re: SingleApplication (qt4.4)
Отправлено: ритт от Июнь 10, 2008, 02:40
Получилось поправить:

отредактировал singleapplication.h

блок

Код:
#ifdef Q_OS_WIN
# ifdef SINGLE_APPLICATION_DLL
# ifdef SINGLE_APPLICATION_BUILD_LIB
# define SINGLE_APPLICATION_EXPORT Q_DECL_EXPORT
# else
# define SINGLE_APPLICATION_EXPORT Q_DECL_IMPORT
# endif
# endif
#endif
#ifndef SINGLE_APPLICATION_EXPORT
# define SINGLE_APPLICATION_EXPORT
#endif

заменил на

Код:
#ifdef Q_OS_WIN
# ifdef SINGLE_APPLICATION_DLL
# ifndef SINGLE_APPLICATION_BUILD_LIB
# define SINGLE_APPLICATION_EXPORT Q_DECL_EXPORT
# else
# define SINGLE_APPLICATION_EXPORT Q_DECL_IMPORT
# endif
# endif
#endif
#ifndef SINGLE_APPLICATION_EXPORT
# define SINGLE_APPLICATION_EXPORT
#endif

и теперь все работает

а собирал статиком?


Название: Re: SingleApplication (qt4.4)
Отправлено: pastor от Июнь 10, 2008, 13:25
Я шас немного переделал файлы конфигурации и все работает отлично. Избавился от всех мной вышеперечисленных проблем. Константин, если тебе интересно я код выложу.

ЗЫ: Проверял под Linux, Win, Qt 4.4.0


Название: Re: SingleApplication (qt4.4)
Отправлено: ритт от Июнь 11, 2008, 02:19
интересно
скинь на мыло или сюда прилепи - обновлю тарболл и перезалью


Название: Re: SingleApplication (qt4.4)
Отправлено: pastor от Июнь 11, 2008, 13:27
Пробуй собрать у себя


Название: Re: SingleApplication (qt4.4)
Отправлено: IGHOR от Июнь 13, 2008, 12:54
Пробуй собрать у себя

Собрал, оно DLL просит носить с ехе файлом.
А можно както без етого ?


Название: Re: SingleApplication (qt4.4)
Отправлено: pastor от Июнь 13, 2008, 14:23

Собрал, оно DLL просит носить с ехе файлом.
А можно както без етого ?

В config.pri выбери статик:

Код:
LIB_CONFIG = staticlib
#LIB_CONFIG = dll


Название: Re: SingleApplication (qt4.4)
Отправлено: IGHOR от Июнь 13, 2008, 16:24

Собрал, оно DLL просит носить с ехе файлом.
А можно както без етого ?

В config.pri выбери статик:

Код:
LIB_CONFIG = staticlib
#LIB_CONFIG = dll

Спасибо!


Название: Re: SingleApplication (qt4.4)
Отправлено: ритт от Июнь 19, 2008, 11:22
пастор, благодарствую.

вот появилось время - подправил проекты
протестируйте сборку под вс, пожалуйста


Название: Re: SingleApplication (qt4.4)
Отправлено: pastor от Июнь 19, 2008, 13:06
пастор, благодарствую.

вот появилось время - подправил проекты
протестируйте сборку под вс, пожалуйста

Проверил под VS2005 + Qt 4.4.0. Появились теже проблемы что и были до моих фиксов.

1. В шареде либа не собираеться:


Цитировать
Generating Code...
        link /LIBPATH:"d:\Projects\Libraries\Qt\4.4.0_vs2005\lib" /NOLOGO /INCRE
MENTAL:NO /DLL /OUT:..\bin\singleapplication.dll @C:\DOCUME~1\pastor\LOCALS~1\Temp\nm6C.tmp
LINK : fatal error LNK1181: cannot open input file 'singleapplication.lib'
NMAKE : fatal error U1077: 'link' : return code '0x49d'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Bin\nmake.exe"' : return code '0x2'
Stop.
NMAKE : fatal error U1077: 'cd' : return code '0x2'
Stop.

2. В статике либа собираеться, но для экзамплов создаёться и *.exe и *.lib


Название: Re: SingleApplication (qt4.4)
Отправлено: ритт от Июнь 19, 2008, 13:11
ага, уже понял, что поторопился выкладывать
где-то запутался - с рабочим проектом тоже не собирается
разберусь - выложу опять


Название: Re: SingleApplication (qt4.4)
Отправлено: ритт от Июнь 19, 2008, 14:20
никто так и не сказал нормально ли собирается под студией

упд:
/* странно, что у нас нет раздела по вопросам потокового программирования */
баловался с примером тривиал и заметил такую штуку: если серверный экземпляр закрыть сразу после получения сообщения, в консоли можно увидеть следующее:
Цитировать
warning: QThread: Destroyed while thread is still running
в количестве, равном количеству запусков клиентских экземпляров.

вроде бы, из ворнинга всё ясно, но я что-то запутался...
Код:
LocalThread::LocalThread(quintptr socketDescriptor, const QString& name, QObject* parent) : QThread(parent)
{
this->socketDescriptor = socketDescriptor;
this->name = name;
}

LocalThread::~LocalThread()
{
}

void LocalThread::run()
{
QLocalSocket socket;
if(!socket.setSocketDescriptor(socketDescriptor) || socket.state() != QLocalSocket::ConnectedState)
return;

// send app_id to client
if(!writeMessage(&socket, name))
return;

// wait to messages from client
while(socket.state() == QLocalSocket::ConnectedState)
{
if(socket.waitForReadyRead(1000))
{
// ...
}
}
}
видимо, в момент разрушения поток ещё отрабатывает условный цикл...хоть клиент и умер уже пару секунд назад и сокет должен быть разорван...
наверное, стоит ввести ивентлуп в LocalThread?


Название: Re: SingleApplication (qt4.4)
Отправлено: pastor от Июнь 23, 2008, 21:29
никто так и не сказал нормально ли собирается под студией

Шаред собираеться и работает нормально. А как собрать статик (что-то я ненашел где это выставить)?


Название: Re: SingleApplication (qt4.4)
Отправлено: pastor от Июнь 23, 2008, 21:37
Попробуй так:

Код:
LocalThread::LocalThread(quintptr socketDescriptor, const QString& name, QObject* parent) : QThread(parent)
{
this->socketDescriptor = socketDescriptor;
this->name = name;
}

LocalThread::~LocalThread()
{
    if (!isRunning())
        return;

    stop();
    wait();
}

void LocalThread::stop()
{
QMutexLocker locker( &m_stopMutex );
m_stopped = true;
}

void LocalThread::run()
{
m_stopMutex.lock();
m_stopped = false;
m_stopMutex.unlock();

QLocalSocket socket;
if(!socket.setSocketDescriptor(socketDescriptor) || socket.state() != QLocalSocket::ConnectedState)
return;

// send app_id to client
if(!writeMessage(&socket, name))
return;

// wait to messages from client
while(socket.state() == QLocalSocket::ConnectedState && !m_stopped)
{
if(socket.waitForReadyRead(1000))
{
// ...
}
}
}


Название: Re: SingleApplication (qt4.4)
Отправлено: ритт от Июнь 23, 2008, 22:58
никто так и не сказал нормально ли собирается под студией

Шаред собираеться и работает нормально. А как собрать статик (что-то я ненашел где это выставить)?

в config.pri:
Цитировать
# Chose one of the following two lines to configure the build
#SINGLEAPPLICATION_LIBCONFIG = dll
SINGLEAPPLICATION_LIBCONFIG = staticlib
должно собирать статическую версию...нет?


Название: Re: SingleApplication (qt4.4)
Отправлено: pastor от Июнь 23, 2008, 23:02
должно собирать статическую версию...нет?

Сорри, просмотрел. Каюсь ;)


Название: Re: SingleApplication (qt4.4)
Отправлено: ритт от Июнь 25, 2008, 06:05
проглядел...статик действительно не собирало :)
обновил до 0.3.1 (в 0.3 появился пример "лоадер")


Название: Re: SingleApplication (qt4.4)
Отправлено: ритт от Июнь 27, 2008, 06:58
у меня сегодня появилось нехорошее "подозрение"...и оно, мля, оправдалось :(
а именно: "с каких пор нэймэд пайпз видимы только для породившего их пользователя?!" - та же ошибка, что и у димин'ского дсинглаппликейшен!
как бы некритично - свою задачу СА и так выполняет...но не совсем отвечает заявленному функционалу :)

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


Название: Re: SingleApplication (qt4.4)
Отправлено: Tonal от Июнь 27, 2008, 07:56
Для винды, думаю будет интересна следующая статейка: http://msdn.microsoft.com/en-us/library/aa382954(VS.85).aspx


Название: Re: SingleApplication (qt4.4)
Отправлено: Sergeich от Июнь 27, 2008, 23:48
2 Константин: Повторяю вопрос (http://prog.org.ru/forum/index.php/topic,7213.msg36542.html#msg36542): хочу пользовать сие в коммерческом приложении с закрытыми исходниками, можно?


Название: Re: SingleApplication (qt4.4)
Отправлено: ритт от Июнь 28, 2008, 00:59
Тонал, из статейки вынес, что подобный КО должен создаваться в нэймспейсе юзверя (если я правильно понял)
провожу простой эксперимент: запускаю тривиал под админом (хрень про сп2), логинюсь под другим админом и запускаю тривиал опять - тишина, возвращаюсь в первую учётку - вуаля - мессаги от других экземпляров
похоже, я чего-то недопонимаю(?)
на винапи довольно давно не писал ничего _вообще_. откопал старый код получения юзверь-инфы под нтями...мсдн говорит, что под 9х этот код даже не запустится.
наставьте на путь истинный? :)

Сергеич, можно - не вопрос!
кинте в меня линкой на лжпл...а то лень заела :)


Название: Re: SingleApplication (qt4.4)
Отправлено: Sergeich от Июнь 28, 2008, 12:31
Сергеич, можно - не вопрос!
кинте в меня линкой на лжпл...а то лень заела :)
Ну дык собственно вот (http://ru.wikipedia.org/wiki/GNU_Lesser_General_Public_License).


Название: Re: SingleApplication (qt4.4)
Отправлено: Sergeich от Июнь 28, 2008, 14:11
Посмотрел пример loader. Обнаружил что:
1) При первом запуске параметры командной строки не обрабатываются
2) При повторных запусках окно не активируется
Поправил main.cpp:
Код:
#include <QtCore/QObject>
#include <QtCore/QString>
#include <QtGui/QApplication>

#include "mainwindow.h"
#include "singleapplication.h"

#ifdef Q_WS_WIN
#include <QtCore/QLibrary>
typedef int (*ASFW_Func) (qint32);
#endif

int main(int argc, char* argv[])
{
QApplication app(argc, argv);
QStringList args = app.arguments();
args.removeFirst();
QString message = args.join(" ");

#ifdef Q_WS_WIN
ASFW_Func AllowSetForegroundWindow = (ASFW_Func) QLibrary::resolve("user32", "AllowSetForegroundWindow");
if (AllowSetForegroundWindow)
AllowSetForegroundWindow(-1);
#endif

SingleApplication instance("LoaderExample");
if(instance.isRunning())
{
if(instance.sendMessage(message))
return 0;
}

MainWindow mw;
mw.handleMessage(message);
mw.show();

QObject::connect(&instance, SIGNAL(messageReceived(const QString&)),
&mw, SLOT(handleMessage(const QString&)));

return app.exec();
}


Название: Re: SingleApplication (qt4.4)
Отправлено: ритт от Июнь 28, 2008, 15:17
у меня на строке AllowSetForegroundWindow(-1) сегфоултит с сообщением: 0x6e12f932 in ZN7QString17fromLatin1_helperEPKci () from QtCore4.dll

обработку параметров исправил
перелицензировал под лжпл2


Название: Re: SingleApplication (qt4.4)
Отправлено: Sergeich от Июнь 28, 2008, 17:41
у меня на строке AllowSetForegroundWindow(-1) сегфоултит с сообщением: 0x6e12f932 in ZN7QString17fromLatin1_helperEPKci () from QtCore4.dll
А че за компилятор и операционка? Попробуй поставить
typedef int (*ASFW_Func) (unsigned long);


Название: Re: SingleApplication (qt4.4)
Отправлено: ритт от Июнь 28, 2008, 18:02
win32xp pro sp2, gcc3.4.5
по идее DWORD == qint32
/* при ансигнед получу ворнинг для -1 */
почитал на мсдн о асфв...как я понял, константа ASFW_ANY и есть -1 ?

сигсерв получаю в любой следующей за AllowSetForegroundWindow(-1) строке кода
пробовал вместо -1 подставлять ид процесса, 0 и просто наобум ( :) ) - результат один и тот же
был бы признателен, если бы кто-то ещё попробовал пример с AllowSetForegroundWindow под мингвом


Название: Re: SingleApplication (qt4.4)
Отправлено: Sergeich от Июнь 28, 2008, 18:21
Мда... лучше так:
Код:
#ifdef Q_WS_WIN
#include <QtCore/QLibrary>
#include <windows.h>

typedef BOOL (*ASFW_Func) (DWORD);
#endif
А QLibrary::resolve чего возвращает? Может оно уже определено? И лучше написать:
Код:
#ifdef Q_WS_WIN
ASFW_Func asfw = (ASFW_Func) QLibrary::resolve("user32", "AllowSetForegroundWindow");
if (asfw)
asfw(-1);
#endif


Название: Re: SingleApplication (qt4.4)
Отправлено: ритт от Июнь 28, 2008, 18:52
так тоже пробовал - глухо

windows.h подключает winuser.h, где при условии #if (_WIN32_WINNT >= 0x0500 || _WIN32_WINDOWS >= 0x0490) объявляется BOOL AllowSetForegroundWindow(DWORD);

другими словами,
win32:LIBS   += -luser32
+
Код:
#ifdef Q_WS_WIN
// WindowsNT4   0x0400
// Windows2000  0x0500
// WindowsXP    0x0501
// Windows2003  0x0502
// WindowsVista 0x0600
# define _WIN32_WINNT 0x0501
# include <windows.h>
#endif

int main(int argc, char* argv[])
{
#ifdef Q_WS_WIN
AllowSetForegroundWindow(ASFW_ANY);
#endif
//...
программа работает, окно на переднем плане
если не устанавливаю _WIN32_WINNT, гцц матерится на AllowSetForegroundWindow и ANY - значит, _WIN32_WINNT пустая...
как в таком случае устанавливать _WIN32_WINNT автоматом?

всё это, конечно, чепуха...мне по?ую будет ли у кустомера в примере окно фореграундом...
но не понимаю почему с резолвом символа такой облом


Название: Re: SingleApplication (qt4.4)
Отправлено: Tonal от Июнь 29, 2008, 20:28
Вот очень подробная статья: http://rsdn.ru/article/baseserv/avins.xml


Название: Re: SingleApplication (qt4.4)
Отправлено: ритт от Июнь 29, 2008, 22:24
ещё до 0.1-го релиза у меня была мысля создавать/проверять системный мутекс перед запуском серверной части...и даже было частично реализовано
в общем, добавлю в версии 0.5


Название: Re: SingleApplication (qt4.4)
Отправлено: ритт от Июнь 30, 2008, 13:10
подтверждаю делом :)
0.5б1: реализовал настоящее "один экземпляр на пользователя" посредством системного (КО) семафора + уникального для пользователя префикса к имени пайпы
если общение между экземплярами не требуется, достаточно семафора

поскольку под рукой нет лялихи с четвёртой кутёй, тестировалось (и работало) по хренью сп2
под лялихами знаю только, что должно собираться...теоритически работать тоже должно, но мог наплужить с таймаутами у семафора

слышал, что со сборкой статиклиба тоже что-то невменяемое
поэтому выкладываю бэту и надеюсь, что кто-нибудь погоняет под *нихами и отпишется


Название: Re: SingleApplication (qt4.4)
Отправлено: ритт от Июль 04, 2008, 11:24
ауу! протестируйте кто-нибудь под лялихами и отпишитесь?
если всё гут, я остановлюсь пока на версии 0.5 и ничего в ближайшее время дописывать не буду


Название: Re: SingleApplication (qt4.4)
Отправлено: Red Devil от Июль 04, 2008, 16:58
На Qt 4.3.1 будет работать ?
я могу потестить, но 4.4 у меня под линуксом собрать невозможно из-за компилятора древнего.


Название: Re: SingleApplication (qt4.4)
Отправлено: ритт от Июль 04, 2008, 18:13
SA зависит от QLocal(Client|Server), которые были добавлены в 4.4
сейчас обкромсаю код и попробую собрать у знакомого под 4.3.4 (фактически меня только семафор интересует, т.к. работа с сокетами не менялась)

но всё-равно хотелось бы услышать о боевом испытании...


Название: Re: SingleApplication (qt4.4)
Отправлено: ритт от Июль 04, 2008, 20:02
в общем, тестирование прошло успешно. механизм работает.
если с таймаутами под лялих чего-то и напутал слегка, на функциональность это не должно повлиять.

версия 0.5 доступна для загрузки: http://www.qt-apps.org/content/show.php/SingleApplication?content=81163
надеюсь, кому-нибудь оно будет полезно!


Название: Re: SingleApplication (qt4.4)
Отправлено: Red Devil от Июль 06, 2008, 12:10
Проверил на Slackware 12.1 (Qt 4.4.0).
Все работает и компилируется без единого варнинга и ошибки.

Позже еще себе буду Suse ставить, на ней проверю.


Название: Re: SingleApplication (qt4.4)
Отправлено: ритт от Ноябрь 30, 2008, 01:10
версия 1.0 доступна для загрузки: http://www.qt-apps.org/content/show.php/SingleApplication?content=81163

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


Название: Re: SingleApplication (qt4.4)
Отправлено: Hort от Ноябрь 30, 2008, 18:26
плохо что мне нужно именно под qt4.3


Название: Re: SingleApplication (qt4.4)
Отправлено: ритт от Ноябрь 30, 2008, 23:32
плохо, конечно, но ты всегда можешь взять реализацию QSharedMemory и QLocal(Server|Socket) из самой кутэ и добавить непосредственно к SA


Название: Re: SingleApplication (qt4.4)
Отправлено: ритт от Январь 29, 2009, 19:03
версия 1.1:
   
  • страшная модель "по потоку на сокет" заменена на "все сокеты в одном потоке" (всё-равно локалсервер по умолчанию принимает до 30 соединений - это не так много для одного потока, а больше вряд ли кому-то потребуется);
  • статические методы отправились в небытие (так и не смог придумать ни одного примера, где это могло бы пригодиться);
  • добавлен пример "console".

предполагается, что 1.1 - это последняя версия, использующая локалсокеты и зависящая от 4.4. в свободное время займусь новой реализацией.
заодно хотелось бы поинтересоваться у /* потенциальных */ пользователей:
  • нужен ли режим обнаружения другого экземпляра без возможности передачи данных между экземплярами? если да, то на каком этапе этот режим следует определять (compile-time/run-time)?
  • имеет ли смысл ввести метод для отправки "сырых данных" ака QByteArray? другими словами, будет ли полезной возможность передавать на сервер не только строки, но и произвольные структуры?
  • будет ли полезной возможность отправлять сообщения от сервера клиенту(ам) (вроде броадкаста)?

тестирование, предложения и пожелания приветствуются!


Название: Re: SingleApplication (qt4.4)
Отправлено: kuzulis от Январь 29, 2009, 20:23
Цитировать
будет ли полезной возможность отправлять сообщения от сервера клиенту(ам) (вроде броадкаста)?
если имеется ввидо это:
1. клиент подключается к серверу
2. запрашивает у сервера какие то данные спорадически  (не отключаясь после запроса - а поддерживая канал в коннекте) :)
3. сервер время от времени шлет ПОДКЛЮЧЕННОМУ  клиенту данные спорадически (не отключая при этом клиента после передачи ему данных)

то это оч нужно! :) (мне по крайней мере для моего "проекта")
штобы был FullDuplex :)

ЗЫ: и кстати, когда там xml-rpc под QT4 переделаете? :) оч нужно !!! (именно там нужен FULL DUPLEX)


Название: Re: SingleApplication (qt4.4)
Отправлено: ритт от Январь 29, 2009, 20:38
"отключений" как таковых не продполагается вообще, т.к. при внезапной смерти клиент не в состоянии уведомить сервер об отключении. можно, конечно, следить за клиентами по их пиду (всё-таки клиент и сервер выполняются на одной машине в единой сессии), но имеет ли смысл серверу вообще знать своих клиентов "в лицо"?
всё же последний пункт мне не кажется востребованным, но спросить никогда лишним не бывает...

на счёт хмл-рпц: бОльшая часть запланированного уже реализована, но продолжить смогу только на следующей неделе...если в новом месяце не загрузят с головой...


Название: Re: SingleApplication (qt4.4)
Отправлено: kuzulis от Январь 29, 2009, 20:56
Цитировать
следить за клиентами по их пиду (всё-таки клиент и сервер выполняются на одной машине в единой сессии), но имеет ли смысл серверу вообще знать своих клиентов "в лицо"?
1. насчет единой сессии - я не знал
2. насчет одной машины тож не знал
:)
Зы: не вникал в суть

Но пусть сервер все - же знает в лицо! :)





Название: Re: SingleApplication (qt4.4)
Отправлено: xintrea от Январь 30, 2009, 00:51
версия 1.1:

Пара вопросов.

1. Решение сделано в виде какого-то компонента. При статической сборке под лялих и винду надо ли будет как-то по особенному извращаться?

2. Как у вашего решения обстоят дела с многопользовательской работой. То есть на одном компе залогинился один пользователь, запустил прогу, потом в другом дисплее залогинился другой. Будет ли прога у второго запущена или нет?

предполагается, что 1.1 - это последняя версия, использующая локалсокеты и зависящая от 4.4. в свободное время займусь новой реализацией.

3. Если реализовано через локалсокеты могут ли настройки фаирвола влиять на работу вашего компонента?

4. А будет ли работать ваш компонент в Qt 4.5 ?


Название: Re: SingleApplication (qt4.4)
Отправлено: ритт от Январь 30, 2009, 01:27
1. нет
2. да
3. НЕТ
4. да


Название: Re: SingleApplication (qt4.4)
Отправлено: IMPOMEZIA от Январь 30, 2009, 16:40
Константин
Цитировать
нужен ли режим обнаружения другого экземпляра без возможности передачи данных между экземплярами?
Да, если это позволит создать исключительно простой облегчённый вариант библиотеки, т.е. compile-time.
Цитировать
имеет ли смысл ввести метод для отправки "сырых данных" ака QByteArray?
Да, думаю, было бы полезно.
Цитировать
будет ли полезной возможность отправлять сообщения от сервера клиенту(ам) (вроде броадкаста)?
Не понятно это что и как, выходит за рамки SingleApplication, это уже что-то большее.


Название: Re: SingleApplication (qt4.4)
Отправлено: IMPOMEZIA от Февраль 01, 2009, 20:42
не сработает если запустить два экземпляра сразу друг за другом:
Код
DOS
start trivial.exe
start trivial.exe
из-за этой проверки в trivial/main.cpp
Код
C++ (Qt)
if(instance.sendMessage(message))
 return 0;


Название: Re: SingleApplication (qt4.4)
Отправлено: ритт от Февраль 01, 2009, 21:25
что именно не сработает? уточни, пожалуйста.


Название: Re: SingleApplication (qt4.4)
Отправлено: IMPOMEZIA от Февраль 01, 2009, 22:22
Запустятся два экземпляра trivial.exe


Название: Re: SingleApplication (qt4.4)
Отправлено: ритт от Февраль 01, 2009, 22:58
действительно :(
такая проверка уже несколько версий не нужна, т.к. локалсервер может и не подняться вовсе.

а по предшествующим вопросам:
  • в 1.1 добавил опцию для отключения sendMessage/messageReceived (архив ещё не обновлял)
  • "отправлять сообщения от сервера клиенту(ам)" - сам не могу придумать зачем это может понадобиться, вот и спросил :)


Название: Re: SingleApplication (qt4.4)
Отправлено: Tonal от Февраль 02, 2009, 09:36
Сообщение конкретному клиенту вполне понятно зачем. Например правильная обработка ошибок параметров. сценарий примерно такой:
Клиент запускается с параметрами, и ждёт подтверждения сервера или кода ошибки, который и отдаёт наружу.
Броадкаст может понадобится, если могут быть клиенты ждущие сервера, а нам нужно всем разослать сообщение о завершении сервера. :)


Название: Re: SingleApplication (qt4.4)
Отправлено: ритт от Февраль 02, 2009, 17:31
это действительно может быть полезным. даже вижу уже как это можно было бы использовать в одном проекте...
вот только остаётся проблема с тем, что в ряде случаев клиент может умереть внезапно, не успев должным образом уведомить сервер. надо думать...


Название: Re: SingleApplication (qt4.4)
Отправлено: Tonal от Февраль 03, 2009, 08:26
Да и сервер тоже может умереть. :)


Название: Re: SingleApplication (qt4.4)
Отправлено: fuCtor от Апрель 30, 2010, 08:38
Использую данный компонент, собрал под 4.7TP
При запуске выдает:
Код:
Warning: QObject: Cannot create children for a parent that is in a different thread.
(Parent is QLocalServer(0x636084), parent's thread is QThread(0x185b7e0), current thread is ServerThread(0x636078)

А при выходе:
Код:
Warning: QWinEventNotifier: event notifiers cannot be disabled from another thread
Warning: QWaitCondition: Destroyed while threads are still waiting


Название: Re: SingleApplication (qt4.4)
Отправлено: lit-uriy от Апрель 30, 2010, 13:19
fuCtor, компонент, наверное, давно похоронен, в связи с тем, что Qt Solution теперь всем доступен


Название: Re: SingleApplication (qt4.4)
Отправлено: ритт от Май 01, 2010, 05:58
fuCtor, компонент, наверное, давно похоронен, в связи с тем, что Qt Solution теперь всем доступен

именно. даже 1.1 поленился выкладывать...


Название: Re: SingleApplication (qt4.4)
Отправлено: fuCtor от Май 05, 2010, 07:15
Ок ) понятно.