On-line: PSP, гостей 0. Всего: 1 [подробнее..]
АвторСообщение
постоянный участник




Пост N: 2121
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 21.03.12 13:20. Заголовок: Как предотвратить второй запуск программы в МиниГуи ?


Делаю программу на МиниГуи, типа меню запуска других программ.
Хочу вызывать свои доп. ЕХЕ-ники (терминалки на хХарборе) из главного меню программы на МиниГуи. Вызовом ShellExecute().
Как сделать, чтоб повторно нельзя было запускать уже запущенную программу ?
Я пока знаю 2 варианте:
1) Можно было бы писать файл-семафора что запущена программа, а при завершении терминалки удалять этот файл.
Но это как-то не солидно... И при случайном сбое, нельзя будет запустить программу.
2) Поискать в памяти запущенный процесс (окно с именем). Но это ТОРМОЗА - я уже наталкивался на эти грабли. По России уже наблюдал 3 случая "тормозов" при проверке повторного запуска программы (я писал об этом в другой ветке, здесь на форуме).

Какие еще варианты можно использовать ?

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 27 , стр: 1 2 All [только новые]





Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 21.03.12 13:56. Заголовок: Как предотвратить второй запуск программы


Вариант с монопольно открытым файлом - достаточно прост и надежен.
При запуске - создаете в рабочей папке,
где запускаете приложение - дополнительный файл -вроде [имя exe].run
Каждая следующая попытка запуска приложения "имя exe"
предварительно проверяет - отсутствие файла [имя exe].run
или возможность его удаления.
Если файл есть и его не удалось удалить - нельзя делать запуск.

Спасибо: 0 
Цитата Ответить
постоянный участник




Пост N: 2123
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 21.03.12 14:14. Заголовок: petr707 пишет: Если..


petr707 пишет:

 цитата:
Если файл есть и его не удалось удалить - нельзя делать запуск.


Это не факт.
Натыкался на случаи (и не раз) сбоя на ХР, при вылете программы по ошибке, файл-семафора остается блокированным и запустить заново терминалку НЕЛЬЗЯ !
Помогает только перезагрузка компа ! ! !
Но это же не дело...

Спасибо: 0 
ПрофильЦитата Ответить



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 21.03.12 14:37. Заголовок: Натыкался на случаи...


На практике - непонятую (непонятную) блокировку файла наблюдал только на компах, где установлен Google Desktop или работает Window Search на NTFS, который проводит индексацию файлов в фоновом режиме.
При конфигурации(инсталляции) прикладного ПО - снимите в свойствах папки, где exe, "Индексировать папку для быстрого поиска"


Спасибо: 0 
Цитата Ответить



Пост N: 115
Зарегистрирован: 17.06.10
ссылка на сообщение  Отправлено: 21.03.12 16:36. Заголовок: можно через FindWind..


можно через FindWindow(), можно чнрез TaskBar

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 2124
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 21.03.12 18:15. Заголовок: petr707 пишет: При ..


petr707 пишет:

 цитата:
При конфигурации(инсталляции) прикладного ПО - снимите в свойствах папки, где exe, "Индексировать папку для быстрого поиска"


Не подключены компы к Инету. И службу индексации - всегда выключаю. Все равно эпизодически были такие ошибки.

fil пишет:

 цитата:
можно через FindWindow(), можно чнрез TaskBar



А чуть подробней можно ? Как код будет выглядеть ?


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 116
Зарегистрирован: 17.06.10
ссылка на сообщение  Отправлено: 21.03.12 18:34. Заголовок: FindWindow(Заголовок..


FindWindow(Заголовок главного окна приложения) - на форуме мелькало. Если нет в Минигуи, API прицепи
TaskBar - Наверняка в Минигуи есть возможность получить список задач

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 752
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 21.03.12 20:42. Заголовок: Существует механизм ..


Существует механизм мьютексов. http://ru.wikipedia.org/wiki/%CC%FC%FE%F2%E5%EA%F1
Харбор умеет с ними работать.

Спасибо: 0 
ПрофильЦитата Ответить



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 21.03.12 22:55. Заголовок: А что такое - "повторный" ?


Мьютекс отработает при запуске из одной операционной среды - локальный комп или терминал-сервер.
При выполнении задачи в одной сетевой папке - но с разных компов, с мьютексом не получится, isn'it ?
Неплохо бы уточнить, что такое "повторный запуск".
Миллионы( а может и больше) юзеров "повторно" запускают IE ( не реклама)

Спасибо: 0 
Цитата Ответить
постоянный участник




Пост N: 2125
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 22.03.12 00:49. Заголовок: petr707 пишет: Непл..


petr707 пишет:

 цитата:
Неплохо бы уточнить, что такое "повторный запуск".



Подразумевалось локальный комп (папка программы) или терминал-сервер.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 2126
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 22.03.12 00:51. Заголовок: PSP пишет: Существу..


PSP пишет:

 цитата:
Существует механизм мьютексов. http://ru.wikipedia.org/wiki/%CC%FC%FE%F2%E5%EA%F1
Харбор умеет с ними работать.



А примеры есть ? Кто нибудь работал с этим на Харборе ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 83
Зарегистрирован: 29.05.10
ссылка на сообщение  Отправлено: 22.03.12 08:57. Заголовок: Andrey пишет: А при..


Andrey пишет:

 цитата:
А примеры есть ? Кто нибудь работал с этим на Харборе ?


Ну например можно сделать что-то типа :

if IsExeRunning( cFileName( "mors" ) )
MsgStop( "Программа уже работает ! ", "Внимание ..." )
return( NIL )
endif
Вместо возврата можно активировать окно.
А сама IsExeRunning может быть , к примеру ,такой-
#ifdef __FLAT__

HB_FUNC( ISEXERUNNING ) // ( cExeNameCaseSensitive ) --> lResult
{
HANDLE hMutex = CreateMutex( NULL, TRUE, ( LPTSTR ) hb_parc( 1 ) );

hb_retl( GetLastError() == ERROR_ALREADY_EXISTS );

ReleaseMutex( hMutex );
}

#endif

Это FWH :)

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 354
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 22.03.12 11:26. Заголовок: ММК пишет: Ну напри..


ММК пишет:

 цитата:
Ну например можно сделать что-то типа
...
Вместо возврата можно активировать окно.


Andrey

Посмотри штатный пример из поставки Минигуи:

 цитата:
/* 
* MINIGUI - Harbour Win32 GUI library Demo
*
* Copyright 2002-05 Roberto Lopez <harbourminigui@gmail.com>
* http://harbourminigui.googlepages.com/
*
* Copyright 2006 Grigory Filatov <gfilatov@inbox.ru>
*/

#include "minigui.ch"

#define APP_TITLE 'Main Window'
#define MsgAlert( c ) MsgEXCLAMATION( c, "Warning", , .f. )

FUNCTION Main()
Local hWnd

IF IsExeRunning( cFileNoPath( HB_ArgV( 0 ) ) )

MsgAlert( "The " + APP_TITLE + " is already running!" )

hWnd := FindWindow( APP_TITLE )

IF hWnd > 0

IF IsIconic( hWnd )
Restore( hWnd )
ELSE
SetForeGroundWindow( hWnd )
ENDIF
ELSE

MsgStop( "Cannot find application window!", "Error", , .f. )

ENDIF

ELSE

DEFINE WINDOW Form_Main ;
AT 0,0 ;
WIDTH 640 HEIGHT 480 ;
TITLE APP_TITLE ;
MAIN

END WINDOW

CENTER WINDOW Form_Main

ACTIVATE WINDOW Form_Main

ENDIF

RETURN NIL


#pragma BEGINDUMP

#define HB_OS_WIN_USED
#define _WIN32_WINNT 0x0400

#include <windows.h>
#include "hbapi.h"
#include "hbapiitm.h"

HB_FUNC( ISICONIC )
{
hb_retl( IsIconic( ( HWND ) hb_parnl( 1 ) ) );
}

HB_FUNC ( FINDWINDOW )
{
hb_retnl( ( LONG ) FindWindow( 0, hb_parc( 1 ) ) );
}

#pragma ENDDUMP


У меня работает нормально

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 11
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.03.12 16:09. Заголовок: Andrey пишет: Делаю ..


Andrey пишет:

 цитата:
Делаю программу на МиниГуи, типа меню запуска других программ.
Хочу вызывать свои доп. ЕХЕ-ники (терминалки на хХарборе) из главного меню программы на МиниГуи.


Вот и у тебя появилось много ЕХЕ-ников, а значит и окон. Значит перед тобой встанет задача управлять ими (из терминалки на хХарборе воздействовать на программу МиниГуи и наоборот, переключать фокус окон и т.д. и т.п.).
Меня выручил AutoIt3 скриптовый язык (можно получать ЕХЕ). В нем много отлаженных функций по управлению поведением окон, нажатию на пункты меню, кнопки и др. полезных штук. Прост в использовании. Есть русский help. Это не реклама. Сам наступал на такие грабли. Если интересно могу кинуть русский help для начала.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 2129
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 22.03.12 17:41. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Посмотри штатный пример из поставки Минигуи:


Да он и у меня работает нормально.
Вопрос в другом - как сделать в программе на МиниГуи что бы внешняя программа (терминалка на хХарборе) запускалась ТОЛЬКО ОДИН раз ?

Спасибо: 0 
ПрофильЦитата Ответить



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 22.03.12 19:23. Заголовок: как сделать..


То есть непонятно, что для каждой запускаемой внешней проги нужно сделать свой мьютекс и потом проверять его присутствие?
Функция ISEXERUNNING позволяет задавать параметр [имя мьютекса=имя проги(внешний exe) + еще что угодно]
и использовать эту функцию не только для проверки повторного запуска программы на Минигуи,
а для проверки запуска других программ, и вообще -
для любого события, к которому привяжете и оставите в системе мьютекс.
Например , запускает свою прогу , запускаете некий Ваш отчет и если получите результат = 4,
то создаете мьютекс с именем - Was_report_4
далее - пока не выключите комп, можете проверять следующий факт - был ли сегодня на этом компе
от последнего включения создан отчет с результатом 4 ( а реально - был ли создан мьютекс)
(хотя проверку именно такого событие можно и проще реализовать)

При обнаружении мьютекса запущенного внешнего exe - не обязательно искать окно приложения и переключать на него фокус,
достаточно сообщить юзеру о невозможности повторного запуска внешнего exe


Спасибо: 0 
Цитата Ответить
постоянный участник




Пост N: 13
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.03.12 19:36. Заголовок: Для Andrey.


Вот примеры на AutoIt:
Скрытый текст


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 2132
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 25.03.12 20:41. Заголовок: Спасибо SergKis за п..


Спасибо SergKis за примеры.
Но честное слово не хочется связываться с внешними программами.
Если я сопровождал бы одну свою систему, то можно было бы.

gfilatov2002 пишет:

 цитата:
Посмотри штатный пример из поставки Минигуи:


Посмотрел.
Я на базе нкго для хХарбора делал проверку запуска второй копии программы. Здесь на форуме писал об этом.

Вопрос по функциям этого примера:
1) Функция cFileNoPath() - понятно что делает, а где описание по ней ? В каком руководстве искать такие функции ?
2) Функция Restore() - аналогично ?
3) Функция SetForeGroundWindow() - аналогично ?

4) FindWindow() - понятно что делает. Может в ней описание из 2-х строчек дать ?
5) IsIconic() - не понял что эта функция делает ?



Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 357
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 26.03.12 10:02. Заголовок: Andrey пишет: Вопро..


Andrey пишет:

 цитата:
Вопрос по функциям этого примера


1) главное руководство для программиста - это исходники библиотеки (см. файл h_controlmisc.prg)
2) см. файл c_windows.c
3) Это харбор-переходник для стандартной winapi-функции (см. MSDN) - выводит заданное окно на передний план
4) аналогично п.4
5) аналогично п.4 - эта функция определяет, минимизировано ли заданное окно (см. MSDN снова)
Понимаю, что это сложно (все знать ), но недаром этот пример находится в папке Advanced

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 2133
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 26.03.12 11:17. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Понимаю, что это сложно (все знать ), но недаром этот пример находится в папке Advanced



Спасибо большое за разъяснения !
Сделай пожалуйста к этому примеру комментарии в этих функциях... Очень было бы полезно и для других тоже.
Типа: харбор-переходник для стандартной winapi-функции (см. MSDN) - выводит заданное окно на передний план !

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 358
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 26.03.12 11:55. Заголовок: Andrey пишет: Сдела..


Andrey пишет:

 цитата:
Сделай пожалуйста к этому примеру комментарии в этих функциях


По типу такого

 цитата:
Функция SetForegroundWindow переводит поток, который создал определяемое окно в приоритетный режим и активизирует окно. Ввод с клавиатуры направлен в окно, а различные визуальные ориентиры изменяются для пользователя.

Синтаксис

BOOL SetForegroundWindow
(
HWND hWnd // дескриптор окна, которое переводится в приоритетный режим
);

Параметры

hWnd
Идентифицирует окно, которое должно быть активизировано и переведено в приоритетный режим.

Возвращаемые значения
Если функция завершилась успешно, возвращается значение отличное от нуля. Если функция потерпела неудачу, возвращаемое значение - ноль. Чтобы получить дополнительную информацию об ошибке, вызовите GetLastError.

Замечания
Приоритетное окно - окно наверху Z-последовательности. Это - окно, с которым пользователь работает. В среде приоритетной многозадачности, Вы должны вообще дать возможность управления пользователю, окно которого является приоритетным окном. Однако прикладная программа может вызывать SetForegroundWindow, если требуется перевести себя в активный режим, чтобы отобразить критическую ошибку или информацию, которая требует непосредственного внимания пользователя. Хороший пример - это отладчик, когда он обнаруживает контрольную точку останова программы. Система назначает немного более высокий приоритет потоку, который создал приоритетное окно, чем она делает это по отношению к другим потокам.


Но тогда скоро потребуется повторить весь MSDN

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 2134
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 26.03.12 16:29. Заголовок: Нет не надо так, это..


Нет не надо так, это слишком много.

Достаточно типа такого: харбор-переходник для стандартной winapi-функции (см. MSDN) - выводит заданное окно на передний план !
Самое главное здесь (см. MSDN)
Я думаю и другие поймут, где дальше искать !


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 14
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 26.03.12 16:37. Заголовок: Andrey пишет: не хо..


Andrey пишет:

 цитата:
не хочется связываться с внешними программами.


На мой взгляд, это тот случай, когда можно воспользоваться внешними программами, т.к. по мере обрастания мясом (кодом) основной программы, эти куски спокойно выкидываются - зато времени экономится много.
И если в HB и МиниГуи основным является (gfilatov2002 пишет):

 цитата:

1) главное руководство для программиста - это исходники библиотеки (см. файл h_controlmisc.prg)
2) см. файл c_windows.c
...


Т.е. требуется неплохое знание C, WinApi, ... . А если этого нет, то надо искать альтернативы, пока не накопятся знания по C, WinApi, ... .
Повторюсь в AutoIt3 есть хорошая РУССКАЯ документация с примерами.
AutoIt в Википедии

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 2136
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 26.03.12 16:47. Заголовок: SergKis пишет: На м..


SergKis пишет:

 цитата:
На мой взгляд, это тот случай, когда можно воспользоваться внешними программами, т.к. по мере обрастания мясом (кодом) основной программы, эти куски спокойно выкидываются - зато времени экономится много.



Ну конечно в чем то вы и правы.

Хотя после объяснения gfilatov2002 я понял как мне можно реализовать "свои желания" в данном меню запуска других программ !!!
Сделаю самодостаточный пример для других и отправлю его gfilatov2002 !

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 2137
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 27.03.12 19:36. Заголовок: Сделал самодостаточн..


Сделал самодостаточный пример !
Кому интересно смотрите - http://files.mail.ru/KNQW28

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 1
Зарегистрирован: 05.04.12
ссылка на сообщение  Отправлено: 10.04.12 11:39. Заголовок: Andrey пишет: Сдела..


Andrey пишет:

 цитата:
Сделал самодостаточный пример !
Кому интересно смотрите - http://files.mail.ru/KNQW28



Файл не найден.

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 367
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 10.04.12 14:35. Заголовок: Andrey пишет: Сдела..


Andrey пишет:

 цитата:
Сделал самодостаточный пример


Этот пример будет доступен в следующей сборке библиотеки Минингуи

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 2161
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 10.04.12 22:16. Заголовок: busiki пишет: Файл ..


busiki пишет:

 цитата:
Файл не найден.


Выложил временно здесь http://zalil.ru/33053195

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 27 , стр: 1 2 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 168
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет