LINUX.ORG.RU

qt - как определить, запущено ли приложение

 ,


0

1

Подскажите, кто знает ))

Перед тем как запустить какое-нибудь приложение вот так:

QProcess *proc = new QProcess();
proc->start("/usr/bin/xcalc");

как проверить, а не запущено ли оно уже?

Ну и соответственно либо запустить его либо не делать этого. Если запущено - высветить его поверх всех окон.

Спасибо! )



Последнее исправление: TatianaSh (всего исправлений: 1)

В Qt нет возможности получить список процессов, AFAIK.
Можно запустить «ps aux» и погрепать выхлоп.

dib2 ★★★★★
()
Ответ на: комментарий от dib2

Попробовала так:

proc->start("/usr/bin/fly-term", QStringList() << "ps aux | grep xcalc > /tmp/tmp.txt");

Запускается терминал, но пустой ((

В tmp.txt соответственно ничего не попадает.

А как с параметром то?

В win когда-то делала так:

proc->start(nameMyExe,QStringList() << "/C" << "тирьям-пам-пам");
TatianaSh
() автор топика
Ответ на: комментарий от TatianaSh

Открывай файлы /proc/*/comm и не нужно спавнить внешних утилит. /proc/*/stat, если нужна расширенная инфа.

anonymous
()

Запускать через приложение-обертку, которое захватит какой-то глобальный ресурс и запустит нужное приложение. Проверять, что запущена обертка.

anonymous
()
Ответ на: комментарий от TatianaSh

proc->start(«ps», QStringList() << «ax»);
QByteArray prclist = proc->readAllStandardOutput();

и разбирай prclist на предмет запущенного тобой приложения, это не сложно
в винде по-идее так:

proc->start(«tasklist», QStringList());

dib2 ★★★★★
()
Ответ на: комментарий от dib2
proc->start("ps", QStringList() << "aux");
QString err = proc->errorString();
QByteArray prclist = proc->readAllStandardOutput();

В err - unknown error В prclist - пусто

Я так понимаю, надо ps только из терминала запускать

TatianaSh
() автор топика
Ответ на: комментарий от anonymous

Это для своего приложения, как я поняла, а мне надо запустить не свое)

TatianaSh
() автор топика
Ответ на: комментарий от anonymous

Это не всегда возможно. Например, в инсталляторах приходится проверять, не запущены ли блокирующие установку приложения и просить закрыть их (в виндах часто встречается).

grondek
()
Ответ на: комментарий от anonymous

Можно чуть подробнее? ))

В таком случае все равно надо проверять, запущена ли эта обертка.

Если сделать обертку типа SingleApplication.

Я запускаю обертку, она запускает калькулятор.

Я руками закрываю калькулятор. В этом случае обертка все еще открыта. Получается надо следить, не закрылся ли калькулятор извне... (proc->isOpen())

Так как-то?

Еще бы разобраться с SingleApplication))

TatianaSh
() автор топика
Ответ на: комментарий от TatianaSh

В таком случае все равно надо проверять, запущена ли эта обертка.

Тебе надо проверять, занят ли глобальный ресурс. Например, обертка может создать сокет $TMP_DIR/usr/bin/xcalc, запустить этот calc и ждать на этом сокете. Повторный запуск обертки попробует открыть сокет и записать в него коменду SWOW_ME_THE_APPLICATION_WINDOW, если сокета нет, создать его и запустить calc.

Или по пути $TMP_DIR/usr/bin/xcalc записывать PID этого калка. Но при любом раскладе, как-то нужно следить, что обертка не завершила внезапно свою работу, оставив сокет или PID файл на диске (блокировать этот файл, например, эксклюзивно).

anonymous
()

К слову об одноэкземплярном приложении: http://habrahabr.ru/post/173281/

Кроссплатформенно, костыльно и вырвиглазно \m/

jeuta ★★★★
()

ifdef Q_OS_WIN или там Q_OS_LINUX, для Linux запускаешь ps и грепаешь выхлоп как уже писали выше. Если честно, я нередко прибегаю к тупому грепанью выхлопа утилит в своих программах...

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Как-то костыльненько грепать что-то в своих программах (не скриптах). Я бы все же посмотрел как это в том же ps или в htop (ЕМНИП он с ключами запуска процессы умеет отображать, если надо) сделано и сделал бы себе обертку для вины и линукса.

anonymous
()
Ответ на: комментарий от I-Love-Microsoft

Раз уж вы нередко это делаете, можете код показать?

Я ту выше писала код, видимо что-то не так делаю.

Запускать терминал с параметром не получается.

Так тоже:

QProcess *proc = new QProcess();
QStringList arguments;
arguments << "aux";
proc->start("/bin/ps", arguments);
QString err = proc->errorString();
QByteArray output = proc->readAllStandardOutput();

В err - unknown error.

Я так понимаю, для ps нужен интерпретатор, терминал. Как в Win cmd.

TatianaSh
() автор топика
Ответ на: комментарий от TatianaSh

Вот старый мой код (видно и стыдно :) Он работает, только я его в отдельный поток помещаю при помощи moveToThread...

#include "ping2.h"

#include <QProcess>
#include <QDebug>

ping2::ping2(QObject *parent) :
	QObject(parent)
{
//	connect(&period_timer, SIGNAL(timeout()), this, SLOT(process_fping()), Qt::QueuedConnection);
	period_timer.singleShot(500, this, SLOT(process_fping()));
}

void ping2::stop()
{
	qDebug() << "ping2::stop";
	QMetaObject::invokeMethod(this, "slot_stop", Qt::QueuedConnection);
}

void ping2::slot_stop()
{
	qDebug() << "ping2::slot_stop";
	hosts.clear();
}

void ping2::replace(QHostAddress oh, QHostAddress nh)
{
	QMetaObject::invokeMethod(this, "slot_replace", Qt::QueuedConnection, Q_ARG(quint32, oh.toIPv4Address()), Q_ARG(quint32, nh.toIPv4Address()));
}

void ping2::slot_replace(quint32 oh, quint32 nh)
{
	bool ok = false;
	QHostAddress o = QHostAddress(oh); // old
	QHostAddress n = QHostAddress(nh); // new
//	qDebug() << "slot_replace before" << hosts;
	for(int i = 0; i < hosts.count(); i++)
	{
		if(hosts[i].toIPv4Address() == oh)
		{
			hosts.replace(i, n);
			qDebug() << "ping2 replaced from" << o << "to" << n;
			ok = true;
			break;
		}
	}
//	qDebug() << "slot_replace after" << hosts;
	if(!ok) qDebug() << "ERROR: ping2 can't replace" << o << "to" << n;// << "hosts=" << hosts;
}

void ping2::add_host(QHostAddress remote_host)
{
	QMetaObject::invokeMethod(this, "slot_add_host", Qt::QueuedConnection, Q_ARG(quint32, remote_host.toIPv4Address()));
}

void ping2::slot_add_host(quint32 remote_host)
{
//	qDebug() << "ping2::add_host" << remote_host;
	hosts.append(QHostAddress(remote_host));
//	qDebug() << "ping2 hosts=" << hosts;
}

void ping2::process_fping()
{
	QProcess fping;
	foreach(QHostAddress host, hosts)
	{
		QString has = host.toString();
		fping.start("fping", QStringList() << QString("-t 50") << has);
		fping.waitForFinished();
		fping.waitForReadyRead();
		QString res = fping.readAllStandardOutput();
		if(res.contains("is alive", Qt::CaseInsensitive))
		{
			if(FPING_DEBUG) qDebug() << "ALIVE" << has;
			emit ping_icmp_status(host.toIPv4Address(), true);
		}
		else
		{
			if(FPING_DEBUG) qDebug() << "FAILED" << has;
			emit ping_icmp_status(host.toIPv4Address(), false);
		}
	}

	period_timer.singleShot(1000, this, SLOT(process_fping()));
}

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от grondek

Напиши текстом. А перезаписывать файлы в линуксе можно и наживую. Кто не спрятался я не виноват, как говорится.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.