Автор | Сообщение |
|
| постоянный участник
|
Пост N: 1786
Зарегистрирован: 12.09.06
|
|
Отправлено: 12.06.11 04:05. Заголовок: Как "заморозить" выполнение программы ?
Всем привет. Подскажите как можно остановить (заморозить) выполнение программы до выполнения определенного события в другой программе ? Т.е. я из своей программы на хХарборе (терминалка) запускаю допустим программу "Скачивания из инета" на МиниГуи. Терминалку на хХарборе нужно "заморозить" до конца скачивания ! Иначе ЮЗВЕР будет тыкать мышкой раньше времени.... После того как скачался файл нужно вернуться обратно в терминалку на хХарборе ! Можно конечно сделать "семафорный файл" после получения файла из инета, а в хХарборе проверять каждую минуту есть такой файл или нет. Но это можно было делать и на Клипере (проверку файла). А что нам может предложить хХарбор ?
|
|
|
Новых ответов нет
, стр:
1
2
3
4
All
[см. все]
|
|
|
| |
Пост N: 49
Зарегистрирован: 18.02.11
|
|
Отправлено: 12.06.11 20:09. Заголовок: Andrey пишет: А чт..
Andrey пишет: цитата: | А что нам может предложить хХарбор ? |
| Я использую для таких вещей скриптовый язык AutoIt3. Запускаем прогу на МиниГуи (из нее запуск AutoIt3) и делаем терминальное окно hide: WinSetState("myprogram.exe", "", @SW_HIDE). При завершению проги на МиниГуи (из нее запуск AutoIt3) и делаем: WinSetState("myprogram.exe", "", @SW_SHOW) На Harbor не знаю как это сделать, возможно гуру подскажут.
|
|
|
|
| |
Пост N: 124
Зарегистрирован: 05.06.07
|
|
Отправлено: 21.06.11 03:30. Заголовок: WAITRUN..
WAITRUN
|
|
|
|
| постоянный участник
|
Пост N: 1795
Зарегистрирован: 12.09.06
|
|
Отправлено: 22.06.11 00:25. Заголовок: SADSTAR2 пишет: WAI..
SADSTAR2 пишет: Нет такой функции в хХарборе !
|
|
|
|
| постоянный участник
|
Пост N: 513
Зарегистрирован: 25.12.07
|
|
Отправлено: 22.06.11 00:55. Заголовок: Andrey пишет: Всем ..
Andrey пишет: цитата: | Всем привет. Подскажите как можно остановить (заморозить) выполнение программы до выполнения определенного события в другой программе ? |
| Вообще-то была такая тема http://clipper.b.qip.ru/?1-4-0-00000327-000-20-0 Там WaitForSingleObject() ждал окончания другого процесса, но WaitForSingleObject()/WaitForMultipleObjects() могут "ждать" много разных событий и т.д Единственное, чтобы всем этим манипулировать, надо знать в некоторой степени С... Как сделать тоже самое только Харбором - не знаю.
|
|
|
|
| |
Пост N: 125
Зарегистрирован: 05.06.07
|
|
Отправлено: 22.06.11 01:51. Заголовок: Andrey пишет: Нет т..
|
|
|
|
| moderator
|
Пост N: 229
Зарегистрирован: 11.02.10
|
|
Отправлено: 22.06.11 10:22. Заголовок: Andrey пишет: Нет т..
Andrey пишет: цитата: | Нет такой функции в хХарборе |
| Зато такая функция есть в библиотеке минигуи Скрытый текст HB_FUNC( WAITRUN ) { DWORD dwExitCode; STARTUPINFO stInfo; PROCESS_INFORMATION prInfo; BOOL bResult; ZeroMemory( &stInfo, sizeof(stInfo) ); stInfo.cb = sizeof(stInfo); stInfo.dwFlags=STARTF_USESHOWWINDOW; stInfo.wShowWindow=hb_parni(2); bResult = CreateProcess(NULL, hb_parc(1) , NULL, NULL, TRUE, CREATE_NEW_CONSOLE | NORMAL_PRIORITY_CLASS, NULL, NULL, &stInfo, &prInfo); if (!bResult) { hb_retl(-1); } WaitForSingleObject(prInfo.hProcess,INFINITE); GetExitCodeProcess( prInfo.hProcess, &dwExitCode ); hb_retnl( dwExitCode ); }
|
|
|
|
|
| постоянный участник
|
Пост N: 1796
Зарегистрирован: 12.09.06
|
|
Отправлено: 22.06.11 11:34. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | Зато такая функция есть в библиотеке минигуи |
| А как прикрутить ? В смысле, какие include в заголовках включить ? #pragma BEGINDUMP #include <???.h> #pragma ENDDUMP
|
|
|
|
| постоянный участник
|
Пост N: 1859
Зарегистрирован: 12.09.06
|
|
Отправлено: 19.08.11 00:32. Заголовок: Возвращаюсь к текуще..
Возвращаюсь к текущему вопросу, только для ShellExecute . Urri пишет: цитата: | Подскажите, а можно ли затормозить выполнение программы до того момента, пока то, что вызывалось ShellExecute, завершит свою работу? |
| Мне тоже нужно подождать пока ShellExecute выполнит работу, ну и выключить комп потом или продолжит что-то делать.
|
|
|
|
| постоянный участник
|
Пост N: 576
Зарегистрирован: 27.01.07
|
|
Отправлено: 19.08.11 08:34. Заголовок: Вот в этой теме было..
|
|
|
|
| постоянный участник
|
Пост N: 1860
Зарегистрирован: 12.09.06
|
|
Отправлено: 19.08.11 11:43. Заголовок: PSP пишет: Вот в эт..
PSP пишет: Да читал я там до этого. Только там конечного результата не было ! Что конкретно использовать ? WAITRUN( cRun ) EXECANDWAIT() - какие параметры передавать ?
|
|
|
|
| постоянный участник
|
Пост N: 1861
Зарегистрирован: 12.09.06
|
|
Отправлено: 19.08.11 12:13. Заголовок: Сделал тестовую прог..
|
|
|
|
|
| постоянный участник
|
Пост N: 1862
Зарегистрирован: 12.09.06
|
|
Отправлено: 19.08.11 12:57. Заголовок: Хорошую вещь сделал ..
|
|
|
|
| Администратор
|
Пост N: 2040
Зарегистрирован: 23.05.05
|
|
Отправлено: 19.08.11 13:10. Заголовок: Andrey пишет: Хорош..
Andrey пишет: цитата: | Хорошую вещь сделал Pasha - функцию EXECANDWAIT |
| Только я ее не делал, а механически перевел с паскаля на С
|
|
|
|
| постоянный участник
|
Пост N: 1864
Зарегистрирован: 12.09.06
|
|
Отправлено: 19.08.11 14:00. Заголовок: Pasha пишет: Только..
Pasha пишет: цитата: | Только я ее не делал, а механически перевел с паскаля на С |
| Все равно БОЛЬШОЕ СПАСИБО ! Никто другой же не сделал !!!
|
|
|
|
| постоянный участник
|
Пост N: 1865
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.08.11 14:24. Заголовок: Столкнулся с проблем..
Столкнулся с проблемой. При использовании терминала GTWVT - нет вывода на экран запущенного батника через функцию EXECANDWAIT() На GTWIN - все команды батника отображаются в окне задачи. Пример тут: http://files.mail.ru/TAU7FT Там в батнике идет разархивация архива 7z, с обработкой ошибки. Нужно подправить пути и добавить любой архив 7z. Вопрос к знатокам: можно ли сделать еще доп.параметр "показа/скрытия" вывода на экран для GTWVT ? Или вывод в другом окне ?
|
|
|
|
| постоянный участник
|
Пост N: 2069
Зарегистрирован: 12.09.06
|
|
Отправлено: 26.02.12 01:25. Заголовок: Нужно сделать теперь..
Нужно сделать теперь другую задачу. Из МиниГуи вызывать с ожиданием терминалку на хХарборе ! Очень хотелось сделать попроще. WAITRUN() не подошел. Вообще не показывает запущенную терминалку (gtwin или gtwvt) ! В процессах сидит, на экране нет ! Такая же беда как на хХарборе ! Описания в ХЕЛПЕ по МиниГуи нет, искал WAITRUN() по исходникам.... И о чудо - нашел WAITRUNTERM() для терминалки ! Работает !!! Пишу, может кому пригодиться, чтоб не искали в ДОКЕ !
|
|
|
|
| |
Пост N: 20
Зарегистрирован: 19.10.05
|
|
Отправлено: 31.01.14 17:24. Заголовок: xHarbour Compiler bu..
Пришлось изменять старые программы, не переписаннные в GUI. xHarbour Compiler build 1.2.1 + GTWVT-terminal После вызова WAITRUNTERM( не восстанавливается экран после выхода из внешней программы). Например, вызов nRc := WaitRunTerm("Wordpad.exe") WAITRUNTERM Скрытый текст /* WaitRunTerm contributed by Kevin Carmody (i@kevincarmody.com) 2007.11.16 */ HB_FUNC( WAITRUNTERM ) { PHB_ITEM pWaitProc = hb_param( 4, HB_IT_BLOCK ); ULONG ulWaitMsec = ( ISNIL( 5 ) ? 2000 : hb_parnl( 5 ) ); BOOL bTerm = FALSE; BOOL bWait; ULONG ulNoSignal; DWORD dwExitCode; STARTUPINFO stInfo; PROCESS_INFORMATION prInfo; BOOL bResult; ZeroMemory( &stInfo, sizeof( stInfo ) ); stInfo.cb = sizeof( stInfo ); stInfo.dwFlags = STARTF_USESHOWWINDOW; stInfo.wShowWindow = ( WORD ) ( ISNIL( 3 ) ? 5 : hb_parni( 3 ) ); bResult = CreateProcess ( NULL, ( char * ) hb_parc( 1 ), NULL, NULL, TRUE, CREATE_NEW_CONSOLE | NORMAL_PRIORITY_CLASS, NULL, ISNIL( 2 ) ? NULL : hb_parc( 2 ), &stInfo, &prInfo ); if( ! bResult ) hb_retnl( -2 ); if( pWaitProc ) { do { ulNoSignal = WaitForSingleObject( prInfo.hProcess, ulWaitMsec ); if( ulNoSignal ) { hb_evalBlock0( pWaitProc ); bWait = hb_parl( -1 ); if( ! bWait ) { if( TerminateProcess( prInfo.hProcess, 0 ) != 0 ) bTerm = TRUE; else bWait = TRUE; } } else bWait = FALSE; } while( bWait ); } else WaitForSingleObject( prInfo.hProcess, INFINITE ); if( bTerm ) dwExitCode = -1; else GetExitCodeProcess( prInfo.hProcess, &dwExitCode ); CloseHandle( prInfo.hThread ); CloseHandle( prInfo.hProcess ); hb_retnl( dwExitCode ); } #pragma ENDDUMP
| Либо подскажите, пожалуйста, где что не так в EXECANDWAIT для такой связки( не вызывается внешняя программа) : пример вызов nRc := EXECANDWAIT ("Wordpad.exe") EXECANDWAIT Скрытый текст HB_FUNC( EXECANDWAIT ) { char * szProg = hb_parc(1); int iShow = hb_parni(2); DWORD dResult = 0xFFFFFFFF; LONG lResult; STARTUPINFO si; PROCESS_INFORMATION proc; memset( &si, 0, sizeof( si ) ); si.cb = sizeof( si ); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = iShow; if( CreateProcess(NULL, szProg, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &proc ) ) { WaitForInputIdle(proc.hProcess, INFINITE ); if( WaitForSingleObject( proc.hProcess, INFINITE ) == WAIT_OBJECT_0 ) { if( ! GetExitCodeProcess(proc.hProcess, (LPDWORD) &dResult ) ) dResult = 0xFFFFFFFF; } CloseHandle( proc.hThread ); CloseHandle( proc.hProcess ); } lResult = (LONG) dResult; hb_retnl( lResult ); }
|
|
|
|
|
| |
Пост N: 3798
Зарегистрирован: 17.05.05
|
|
Отправлено: 31.01.14 17:50. Заголовок: Avf пишет: EXECAND..
Avf пишет: цитата: | EXECANDWAIT ("Wordpad.exe") |
| а если путь указать к Wordpad.exe
|
|
|
|
| |
Пост N: 21
Зарегистрирован: 19.10.05
|
|
Отправлено: 31.01.14 17:59. Заголовок: Wordpad в той же дир..
Wordpad в той же директории что и программа ( это просто пример )
|
|
|
|
| |
Пост N: 3799
Зарегистрирован: 17.05.05
|
|
Отправлено: 31.01.14 19:23. Заголовок: Avf Harbour 3.2 про..
Avf Harbour 3.2 проверил работает нормально Исходник proc main EXECANDWAIT("notepad.exe") return #pragma BEGINDUMP #include <windows.h> #include "hbapi.h" #include "hbvm.h" #include "hbwinuni.h" HB_FUNC( EXECANDWAIT ) { void * hProg; HB_SIZE nLen; LPCTSTR lpProg = HB_PARSTR( 1, &hProg, &nLen ); DWORD dwResult = 0xFFFFFFFF; STARTUPINFO si; PROCESS_INFORMATION proc; memset( &si, 0, sizeof(si) ); si.cb = sizeof( si ); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = (WORD) hb_parnldef( 2, SW_SHOWDEFAULT ); if( CreateProcess( NULL, HB_STRUNSHARE( &hProg, lpProg, nLen ), /* Command line (Unicode version needs an non-const buffer) */ NULL, NULL, FALSE, CREATE_NO_WINDOW | NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &proc ) ) { hb_vmUnlock(); WaitForInputIdle( proc.hProcess, INFINITE ); if( WaitForSingleObject( proc.hProcess, INFINITE ) == WAIT_OBJECT_0 ) { if( ! GetExitCodeProcess( proc.hProcess, &dwResult ) ) dwResult = 0xFFFFFFFF; } CloseHandle( proc.hThread ); CloseHandle( proc.hProcess ); hb_vmLock(); } hb_retnint( dwResult ); hb_strfree( hProg ); } #pragma ENDDUMP
|
|
|
|
| постоянный участник
|
Пост N: 3222
Зарегистрирован: 12.09.06
|
|
Отправлено: 31.01.14 23:55. Заголовок: Avf пишет: Пришлось..
Avf пишет: цитата: | Пришлось изменять старые программы, не переписаннные в GUI. xHarbour Compiler build 1.2.1 |
| Попробуй 1.2.3 - в предыдущем ошибок много... Avf пишет: цитата: | Либо подскажите, пожалуйста, где что не так в EXECANDWAIT для такой связки( не вызывается внешняя программа) : |
| Она вызывается, просто на экране не отображается. Читай выше - я столкнулся с этим. Avf пишет: цитата: | После вызова WAITRUNTERM( не восстанавливается экран после выхода из внешней программы). |
| Сделай проще: SAVE SCREEN WAITRUNTERM(cFile) RESTORE SCREEN
|
|
|
|
|
| |
Пост N: 22
Зарегистрирован: 19.10.05
|
|
Отправлено: 06.02.14 15:07. Заголовок: Неделю отсутствовал...
Вариант с WAITRUNTERM работает на XHarbour EXECANDWAIT, приведенный выше для Harbour, для ХHarbour должен выглядеть как-то иначе.
|
|
|
|
| постоянный участник
|
Пост N: 5744
Зарегистрирован: 12.09.06
|
|
Отправлено: 02.03.18 18:42. Заголовок: Andrey пишет: Хорош..
Andrey пишет: Программа на терминалке хХарбора 1.2.3 Делаю показ надписи и вызываю программу на МиниГуи: @ 10,10 SAY "Загружаю модуль ХХХ !" EXECANDWAIT(CurDrive()+":"+DirName()+"\XXX-MiniGui.exe") Как можно сделать замену надписи в терминалке через 10-15 сек на другую ? @ 10,10 SAY "Ожидаю закрытия модуля ХХХ !"
|
|
|
|
| |
Пост N: 6741
Зарегистрирован: 17.05.05
|
|
Отправлено: 02.03.18 19:16. Заголовок: На вскидку... 1. Пот..
На вскидку... 1. Поток 2. FT_OnTick 3. HB_IdleAdd
|
|
|
|
| постоянный участник
|
Пост N: 5745
Зарегистрирован: 12.09.06
|
|
Отправлено: 02.03.18 21:03. Заголовок: Dima пишет: 2. FT_O..
Dima пишет: цитата: | 2. FT_OnTick 3. HB_IdleAdd |
| Не работал с этим. Подскажи пожалуйста как это работает ?
|
|
|
|
| постоянный участник
|
Пост N: 1385
Зарегистрирован: 27.01.07
|
|
Отправлено: 02.03.18 21:21. Заголовок: Может просто написат..
Может просто написать: "Запущено внешнее приложение XXX. Чтобы продолжить, закройте его", а?))
|
|
|
|
| постоянный участник
|
Пост N: 5747
Зарегистрирован: 12.09.06
|
|
Отправлено: 02.03.18 21:40. Заголовок: PSP пишет: Может пр..
PSP пишет: цитата: | Может просто написать: "Запущено внешнее приложение XXX. Чтобы продолжить, закройте его", а?)) |
| Пока прога на МиниГуи загрузится... Антивирусник его постоянно проверяет, проходит секунд 10. Пользователь тупо пытается нажать ещё раз и раз на кнопку. Из-за этого и вывесил сообщение. Твоя надпись будет нервировать неподготовленного пользователя. Конечно в МиниГуи приложение можно после запуска отправить терминалке сообщение как в примере: * Передача сообщений между приложениями/процессами при помощи сообщения WM_COPYDATA. Но для простой вещи это перебор... Нужно просто через 10-15 секунд изменить надпись.
|
|
|
|
| |
Пост N: 560
Зарегистрирован: 17.06.10
|
|
Отправлено: 02.03.18 23:40. Заголовок: а таймер незя ?..
а таймер незя ?
|
|
|
|
| постоянный участник
|
Пост N: 5748
Зарегистрирован: 12.09.06
|
|
Отправлено: 03.03.18 00:25. Заголовок: fil пишет: а таймер..
fil пишет: А как в хХарборе делать таймер ? Я уже не помню как делать. В Клипере что-то в СТ было, а как сейчас делать не знаю.
|
|
|
|
| |
Пост N: 6742
Зарегистрирован: 17.05.05
|
|
Отправлено: 03.03.18 09:30. Заголовок: Andrey пишет: А как..
Andrey пишет: цитата: | А как в хХарборе делать таймер ? |
| http://clipper.borda.ru/?1-4-0-00001192-000-0-0-1498420920 Пост 1539 По Ft_ontick FT_OnTick({|| Mytest() },200) @ 10,10 SAY "Загружаю модуль ХХХ !" EXECANDWAIT(CurDrive()+":"+DirName()+"\XXX-MiniGui.exe") FT_OnTick() Func Mytest() @ 10,10 SAY "Ожидаю закрытия модуля ХХХ !" return nil
|
|
|
|
| |
Пост N: 1206
Зарегистрирован: 20.02.11
|
|
Отправлено: 03.03.18 11:40. Заголовок: Andrey пишет: Польз..
Andrey пишет: цитата: | Пользователь тупо пытается нажать ещё раз и раз на кнопку. Из-за этого и вывесил сообщение |
| Проще кнопку задисаблить после нажатия, и сообщение что запущено внешнее приложение Х... А при завешении этой Х.. - раздисаблить и убрать сообщение
|
|
|
|
|
| постоянный участник
|
Пост N: 1771
Зарегистрирован: 17.02.12
|
|
Отправлено: 03.03.18 11:51. Заголовок: Haz :sm36: сохран..
Haz сохранил экран\сделал новый с крупным письмом типа "Ж Д И Т Е ...", потом все воссстановил. Все время так делаю. Пользователь не такой тупой, все понимает, пусть и не с первого раза.
|
|
|
|
| |
Пост N: 6743
Зарегистрирован: 17.05.05
|
|
Отправлено: 03.03.18 12:12. Заголовок: Можно еще "верту..
Можно еще "вертушку" повесить , пока работает внешнее приложение Х , что бы юзер не подумал что прога висит
|
|
|
|
| постоянный участник
|
Пост N: 5749
Зарегистрирован: 12.09.06
|
|
Отправлено: 03.03.18 15:01. Заголовок: Haz пишет: Проще кн..
Haz пишет: цитата: | Проще кнопку задисаблить после нажатия, и сообщение что запущено внешнее приложение Х... А при завешении этой Х.. - раздисаблить и убрать сообщение |
| Нет у меня такого на хХарборе. Dima Спасибо !
|
|
|
|
| |
Пост N: 1207
Зарегистрирован: 20.02.11
|
|
Отправлено: 03.03.18 15:09. Заголовок: Andrey пишет: Нет у..
Andrey пишет: цитата: | Нет у меня такого на хХарборе |
| Не верю (с). Но раз нет, так нет и искать не будем среди множества вариантов.
|
|
|
|
| |
Пост N: 6744
Зарегистрирован: 17.05.05
|
|
Отправлено: 03.03.18 15:22. Заголовок: Haz пишет: Не верю ..
|
|
|
|
| |
Пост N: 6745
Зарегистрирован: 17.05.05
|
|
Отправлено: 03.03.18 16:20. Заголовок: Hbnf :sm38: ..
Hbnf для иксов Libnf
|
|
|
|
| |
Пост N: 6746
Зарегистрирован: 17.05.05
|
|
Отправлено: 03.03.18 16:30. Заголовок: чего ж нет если есть..
чего ж нет если есть в xharbour\contrib\libnf\ontick.c
|
|
|
|
| |
Пост N: 6747
Зарегистрирован: 17.05.05
|
|
Отправлено: 03.03.18 17:08. Заголовок: Попробуй портировать..
Попробуй портировать из Harbour Сырец Скрытый текст THREAD STATIC t_bOnTick THREAD STATIC t_nTickInterval := 0 THREAD STATIC t_nLastCheck := 0 THREAD STATIC t_hIdle STATIC PROCEDURE __ft_OnTick() IF hb_MilliSeconds() >= ( t_nLastCheck + t_nTickInterval ) t_nLastCheck := hb_MilliSeconds() Eval( t_bOnTick ) ENDIF RETURN PROCEDURE ft_OnTick( bOnTick, nTickInterval ) /* Harbour extension: Harbour will also accept function pointers */ IF HB_ISEVALITEM( bOnTick ) t_bOnTick := bOnTick IF HB_ISNUMERIC( nTickInterval ) t_nTickInterval := ( 1 / 18.20648 ) * nTickInterval * 1000 ENDIF t_nLastCheck := hb_MilliSeconds() IF Empty( t_hIdle ) t_hIdle := hb_idleAdd( {|| __ft_OnTick() } ) ENDIF ELSE t_bOnTick := NIL t_nTickInterval := 0 IF ! Empty( t_hIdle ) hb_idleDel( t_hIdle ) t_hIdle := NIL ENDIF ENDIF RETURN
|
|
|
|
|
| |
Пост N: 6748
Зарегистрирован: 17.05.05
|
|
Отправлено: 03.03.18 17:24. Заголовок: Andrey пишет: Я дум..
Andrey пишет: цитата: | Я думаю, что не пойдёт из за: |
| убери THREAD , думаю не смертельно
|
|
|
|
| |
Пост N: 6749
Зарегистрирован: 17.05.05
|
|
Отправлено: 03.03.18 17:31. Заголовок: Andrey пишет: А то ..
Andrey пишет: цитата: | А то мусорница начинается, потом форум читать трудно будет. |
| Не мусори
|
|
|
|
|
| постоянный участник
|
Пост N: 5759
Зарегистрирован: 12.09.06
|
|
Отправлено: 03.03.18 18:18. Заголовок: SergKis пишет: сохр..
SergKis пишет: цитата: | сохранил экран\сделал новый с крупным письмом типа "Ж Д И Т Е ...", потом все воссстановил. Все время так делаю. Пользователь не такой тупой, все понимает, пусть и не с первого раза. |
| Сделал для юзера "Ж Д И Т Е ..." cRunExe := M->SetPath + "MiniGui-module.exe " + cParam EXECANDWAIT(cRunExe) После старта модуля на МиниГуи терминалка висит и сообщение Программа (не отвечает) ! Как это убрать ? Может можно как то повесить показ таймера через каждую секунду или две ? Пробовал сделать как в Пост N: 3833 http://clipper.borda.ru/?1-4-0-00000954-000-0-0-1392306838 Все равно прога висит... Юзер по не знанию может прогу на терминалке крестиком закрыть...
|
|
|
|
| постоянный участник
|
Пост N: 1772
Зарегистрирован: 17.02.12
|
|
Отправлено: 03.03.18 18:47. Заголовок: Andrey ты запускаеш..
Andrey ты запускаешь execandwait, т.е. терминалка должна висеть до завершения минигуи. Определись чего хочешь ? Хочешь, что то делать, делай с idle, пример есть в TEST каталоге, посканируй.
|
|
|
|
| постоянный участник
|
Пост N: 1773
Зарегистрирован: 17.02.12
|
|
Отправлено: 03.03.18 18:50. Заголовок: Andrey пишет Юзер по..
Andrey пишет цитата: | Юзер по не знанию может прогу на терминалке крестиком закрыть... |
| У себя крестик закрываю наглухо (что бы не было желания нажимать). Выход только по меню или кнопкап, т.е. где разрешено.
|
|
|
|
| постоянный участник
|
Пост N: 6735
Зарегистрирован: 12.09.06
|
|
Отправлено: 03.07.20 14:41. Заголовок: Возник вопрос другой..
Возник вопрос другой. Как можно из своей программы (1) запустить заново себя (2) с ожиданием, пока не выгрузиться из памяти (1) сама прога ? Т.е. по ShellExecute( , 'open', Application.ExeName, cParam, , 2 ) прога слишком быстро загружает вторую копию программы. Нужно с ожиданием, пока не выгрузится первая. Если в начале проги стоит команда _HMG_MESSAGE[4] := "Попытка запуска второй копии программы:" + CRLF + ; App.ExeName + CRLF + ; "Отказано в запуске." + CRLF + _HMG_MESSAGE[4] SET MULTIPLE OFF WARNING То при запуске второй проги срабатывает эта команда. Из-за этого и нужен запуск с ожиданием. Как это можно сделать ?
|
|
|
|
| постоянный участник
|
Пост N: 3272
Зарегистрирован: 17.02.12
|
|
Отправлено: 03.07.20 14:47. Заголовок: Andrey wApi_Sleep(1..
Andrey wApi_Sleep(1000) или лови handle окна и текст первого запуска, пока находится, жди, нет его, работай дальше
|
|
|
|
| |
Пост N: 7209
Зарегистрирован: 17.05.05
|
|
Отправлено: 03.07.20 14:49. Заголовок: ISEXERUNNING ?..
ISEXERUNNING ?
|
|
|
|
| постоянный участник
|
Пост N: 6736
Зарегистрирован: 12.09.06
|
|
Отправлено: 03.07.20 15:19. Заголовок: Dima пишет: ISEXERU..
Dima пишет: Не совсем... SergKis пишет: цитата: | или лови handle окна и текст первого запуска, пока находится, жди, нет его, работай дальше |
| Не совсем понятно как делать. Вот примерно такой у меня код: #define PROGRAM 'Моя прога' .... Function Main .... hWnd := FindWindow( PROGRAM ) // здесь же 2 хендла будет. Как перебрать ? // проверка и ожидание // Проверка на запуск второй копии программы OnlyOneInstance( PROGRAM ) ..... Хотя хендл проги (1) можно передать в вызов копии проги (2). Это я понимаю как сделать. А не передавая хендл окна можно сделать ожидание ?
|
|
|
|
| постоянный участник
|
Пост N: 3273
Зарегистрирован: 17.02.12
|
|
Отправлено: 03.07.20 15:29. Заголовок: Andrey пишет Не совс..
Andrey пишет цитата: | Не совсем понятно как делать. |
| Ты только недавно спрашивал про OpenOffis Excel и тебе было предложено EnumWindow() и т.д. Ловишь во второй копии с cParam запуском ShellExecute() Если в первом запуске будешь создавать mutex, можешь ловить его наличие, эту ф-ю то же видел FUNCTION IsExe2Run( cDop ) // Проверка второго запуска программы + (режим или ini) LOCAL i, cMut, hMut, lMut LOCAL cExe := hb_ProgName() LOCAL lRet := .T. STATIC s_hMutex := 0 DEFAULT cDop := "" IF ISLOGICAL(cDop) IF ! empty(s_hMutex) wapi_ReleaseMutex( s_hMutex ) s_hMutex := 0 ENDIF RETURN lRet ENDIF IF ! empty(cDop) .and. ( i := RAt("\", cDop) ) > 0 cDop := subs(cDop, i+1) ENDIF cMut := upper(cExe + cDop) AEval({".","\",":","/"," "}, {|cs| cMut := StrTran(cMut, cs, "_") }) hMut := wapi_CreateMutex( NIL, NIL, cMut ) lMut := ( ! Empty( hMut ) .and. wapi_GetLastError() == 0 ) IF lMut s_hMutex := hMut lRet := .F. ENDIF RETURN lRet // .T. - повторный запуск (mutex уже есть)
|
|
|
|
| постоянный участник
|
Пост N: 6737
Зарегистрирован: 12.09.06
|
|
Отправлено: 03.07.20 16:11. Заголовок: SergKis пишет: Ты т..
SergKis пишет: цитата: | Ты только недавно спрашивал про OpenOffis Excel и тебе было предложено EnumWindow() и т.д. |
| Да я этот вариант помню. Просто думал ещё по другому можно ? И EnumWindow() даёт оба хендла окна. А как узнать хендл окна второй проги ? Т.е. без передачи через cParam узнать нельзя ? Если нельзя, то понятно как делать.
|
|
|
|
| постоянный участник
|
Пост N: 3274
Зарегистрирован: 17.02.12
|
|
Отправлено: 03.07.20 18:29. Заголовок: Andrey пишет Ф-я my..
Andrey пишет [quote]` Ф-я myGetWindowHandles( cText, cClass, lLogOut ) из темы http://clipper.borda.ru/?1-4-0-00000214-000-20-0-1592817166 находит по части текста title + класс окна, в hmg это HMG_<имя main окна> Ты запусти ф-ю с получением лога и все увидишь и текст и класс, вот их и контролируй или используй mutex ф-я выше. В первой создаешь, во второй - проверяешь, если есть, то первая еще работает, нет - закончила работу, вторая перестает ждать, начинает работать. Где тут параметры cParam ? Хотя имя mutex можешь передавать, если имя "плавает"
|
|
|
|
| |
Пост N: 1563
Зарегистрирован: 20.02.11
|
|
Отправлено: 04.07.20 11:57. Заголовок: Зачем мутить с окнам..
Зачем мутить с окнами? 1 Программа при старте получает хендл своего основного процесса 2 Запускает через processrun свою копию ( причём путь запуска можно брать из своего процесса) и передаёт копии хендл. 3 перед инициализации ей главного окна - ожидание завершения предыдущей копии по хендлу. Мжно и не ждать, а терминировать принудительно. Можно и без передачи хендл, тогда запускаемый процесс ищет предыдущую копию и прибивает её. Всё через wmi достаточно просто реализуемо.
|
|
|
|
| постоянный участник
|
Пост N: 3275
Зарегистрирован: 17.02.12
|
|
Отправлено: 04.07.20 12:55. Заголовок: Haz пишет Зачем мути..
Haz пишет Особенно, когда их нет. Консоль, wvt без окна. Лучше для управления процессами использовать mutex, по мне цитата: | Win32 API в Windows имеет две реализации мьютексов — собственно мьютексы, имеющие имена и доступные для использования между разными процессами, и критические секции, которые могут использоваться только в пределах одного процесса разными потоками[ |
|
|
|
|
|
| постоянный участник
|
Пост N: 6738
Зарегистрирован: 12.09.06
|
|
Отправлено: 04.07.20 14:20. Заголовок: Haz пишет: Всё чере..
Haz пишет: цитата: | Всё через wmi достаточно просто реализуемо. |
| А примерный код можешь показать ?
|
|
|
|
| |
Пост N: 7210
Зарегистрирован: 17.05.05
|
|
Отправлено: 04.07.20 15:43. Заголовок: Andrey пишет: А при..
Andrey пишет: цитата: | А примерный код можешь показать ? |
| Ожидаемый вопрос
|
|
|
|
| |
Пост N: 1564
Зарегистрирован: 20.02.11
|
|
Отправлено: 04.07.20 15:52. Заголовок: SergKis пишет: Особ..
SergKis пишет: цитата: | Особенно, когда их нет. Консоль, wvt без окна. Лучше для управления процессами использовать mutex, по мне |
| Разве мутексы не есть семафоры в потоках? В рамках одного процесса можно рулить потоками , но как мутексами рулить в разных процессах ?? это уже из области задач операционки Или я не о том ?
|
|
|
|
| |
Пост N: 1565
Зарегистрирован: 20.02.11
|
|
Отправлено: 04.07.20 16:04. Заголовок: Andrey пишет: А при..
Andrey пишет: цитата: | А примерный код можешь показать ? |
| работа с WMI достаточно хорошо представлена в примерах MINIGUI (поиск по всем *.PRG содержимого WMI ) один из моих древних примеров это tsb_Filter. для понимания рекомендую скачать WMIExplorer - бесплатную и простую версию. Работа через SQL запросы к WMI сервису. Возможностей много, в конкретной задаче интересует запрос к Win32_Process Вот так я убиваю зависшие процессы Excel hWnd:=oExcel:hWnd ... oWmi := WmiService() cSql := "SELECT * FROM Win32_Process WHERE Handle = " + NTOC(GetWindowPID(hWnd)) FOR EACH oItem IN oWmi:ExecQuery( cSql ) oItem:Terminate() NEXT
|
|
|
|
| постоянный участник
|
Пост N: 3276
Зарегистрирован: 17.02.12
|
|
Отправлено: 04.07.20 16:12. Заголовок: Haz пишет Разве муте..
Haz пишет цитата: | Разве мутексы не есть семафоры в потоках? |
| цитата: | Мьютекс Материал из Национальной библиотеки им. Н. Э. Баумана Последнее изменение этой страницы: 11:24, 29 октября 2016. Мью́текс (англ. mutex, от англ. mutual exclusion — «взаимное исключение») — является аналогом одноместного семафора, в программировании необходим для сопоставления синхронно выполняющихся потоков.[1]. Мью́текс представляет собой концепцию программирования, которая используется для решения вопросов многопоточности. Мьютекс отличается от семафора тем, что допускает только один поток в контролируемом участке, заставляя другие потоки, которые пытаются получить доступ к этому разделу ждать, пока первый поток не вышел из этого раздела. Принимает два значенения: открыт - поток может войти в свою критическую секцию; закрыт - поток не может войти в критическую секцию. Задача мьютекса — защита объекта от доступа к нему других потоков, отличных от того, который завладел мьютексом. В каждый конкретный момент только один поток может владеть объектом, защищённым мьютексом. Если другому потоку будет нужен доступ к переменной, защищённой мьютексом, то этот поток засыпает до тех пор, пока мьютекс не будет освобождён. |
| А.Кресин цитата: | Итак, для предотвращения одновременого обращения разных потоков к одному и тому же ресурсу делаем следующее: 1) создаем предварительно mutex: pMtx := hb_mutexCreate() 2) в тех местах программы, где происходит обращение к защищаемым ресурсам, оборачиваем соответствующий код блокировкой/разблокировкой mutex'а, т.е. ставим перед перед ним hb_mutexLock( pMtx ) и после него hb_mutexUnLock( pMtx ) - точно так же, как мы блокируем/разблокируем запись расшаренной базы данных при записи в нее. Не забывайте, что, в отличие от rlock(), hb_mutexLock() приостанавливает дальнейшее выполнение потока, если mutex уже чем-то заблокирован - при невнимательности можно получить deadlock - ситуацию, когда несколько потоков взаимно заблокировали выполнение друг друга. |
| цитата: | собственно мьютексы, имеющие имена и доступные для использования между разными процессами |
| Это использовано в функции выше. Т.е. создаем\убираем mutex в разных приложениях и можем управлять тем или иным алгоритмом.процессом
|
|
|
|
| |
Пост N: 1566
Зарегистрирован: 20.02.11
|
|
Отправлено: 04.07.20 19:01. Заголовок: SergKis пишет: Это ..
SergKis пишет: цитата: | Это использовано в функции выше. Т.е. создаем\убираем mutex в разных приложениях и можем управлять тем или иным алгоритмом.процессом |
| Сергей, в многопоточке это понятно. Я не пойму как это сделать в разных приложениях, у каждого свои потоки в рамках основного процесса. Ты говоришь что можно мютексами общаться между разными запущенными программами.? Не пробовал однако
|
|
|
|
| постоянный участник
|
Пост N: 3277
Зарегистрирован: 17.02.12
|
|
Отправлено: 04.07.20 19:31. Заголовок: Haz пишет Ты говориш..
Haz пишет цитата: | Ты говоришь что можно мютексами общаться между разными запущенными программами.? |
| Mutex это переменная (имя), которую можно создавать, удалять и даже этого уже достаточно, что бы приостанавливать одну прогу, давать работать другой, проверять наличие проги в памяти и если нет, то запускать. К примеру mutex в LetoDbf сервере позволяет сделать простой менеджер слежения, есть в памяти он или нет, т.е. простенькое меню Start Server, Stop Server, Exit и соответсвенно в таком меню делать пункты disable\enable от наличия\отсутсвия сервера в памяти, а проверка по timer наличия mutex позволит автоматически запускать его при отсутствии в памяти. При обеспечении сервером (каждого своим) нескольких клиентов (в разных каталогах установка) такой менеджер может по mutex обеспечить устойчивую работу (что бы всегда был запущен) каждый сервер для своего клиента (под клиентом тут надо понимать организацию). Сервис для сервера не используется у нас.
|
|
|
|
| постоянный участник
|
Пост N: 3278
Зарегистрирован: 17.02.12
|
|
Отправлено: 04.07.20 19:48. Заголовок: PS Ф-я с mutex, была..
PS Ф-я с mutex, была выше, используется для блокировки повторных запусков с иконки, far кликами Enter-ом. Разрешаются повторные запуски проги с одного каталога + ini файл, т.е. с разными ini (беру без пути), можно делать запуски одной программы уст. в какую то dir, а повторный запуск с этим ini не пройдет, причем я не даю никаких сообщений на это, просто выхожу из запуска если mutex уже есть. Т.е. с одного каталога установки программу можно запускать с разными ini (в них указание на базу) Имя mutex формирую upper(hb_ProgName() + cDop) в ф-ии видно алгоритм. В hmg ф-я IsExeRuning() так же использует mutex, но только из имени exe, жесткая блокировка 2 запуска проги.
|
|
|
|
| |
Пост N: 1567
Зарегистрирован: 20.02.11
|
|
Отправлено: 04.07.20 21:44. Заголовок: Спасибо за информаци..
Спасибо за информацию, попробую
|
|
|
|
| постоянный участник
|
Пост N: 7494
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.08.23 11:50. Заголовок: Всегда использовал и..
Andrey пишет: цитата: | Подскажите как можно остановить (заморозить) выполнение программы до выполнения определенного события в другой программе ? |
| Смотреть пример у Григория \samples\Advanced\FreezeAppExecution) ! Всегда использовал и считал что невозможно запустить вторую копию программы... // Проверка на запуск второй копии программы OnlyOneInstance( PROGRAM ) Однако мои юзера опровергли это мнение... Можно запустить вторую копию программы при одном условии, если комп/сервер-терминала выводишь из спящего режима, то вторую копию программы можно запустить. Сам так один раз смог у себя сделать, повторно не смог. Как это (второй запуск) можно железно прекратить ? Только нужно учитывать, что прога может запускаться на сервере-терминалов у разных пользователей одновременно.
|
|
|
|
| постоянный участник
|
Пост N: 4361
Зарегистрирован: 17.02.12
|
|
Отправлено: 01.08.23 12:33. Заголовок: Andrey Используй (с..
Andrey Используй (с mutex) SET MULTIPLE QUIT // выход без сообщения или SET MULTIPLE QUIT WARNING // выход с сообщением или ф-ей IsExeRunning( StrTran( GetExeFileName (), '\', '_' ) ) где параметр (цветом) может быть каталог, ini файл, ... что будет идентифицировать уникальность запуска
|
|
|
|
| постоянный участник
|
Пост N: 7495
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.08.23 13:00. Заголовок: SergKis пишет: SET ..
SergKis пишет: цитата: | SET MULTIPLE QUIT WARNING // выход с сообщением |
| А туда можно прикрутить переключение на хендл запущеной программы ?
|
|
|
|
| постоянный участник
|
Пост N: 4362
Зарегистрирован: 17.02.12
|
|
Отправлено: 01.08.23 13:09. Заголовок: Andrey пишет А туда ..
Andrey пишет цитата: | А туда можно прикрутить переключение на хендл запущеной программы ? |
| Это команда препроцессора, так что замени и делай, что надо #translate SET MULTIPLE QUIT [ <warning: WARNING> ] ; => ; iif ( _HMG_IsMultiple , ( iif ( <.warning.> , AlertStop( _HMG_MESSAGE\[4] ) , ) , ExitProcess() ) , ) значение _HMG_IsMultiple такое (PROCEDURE Init) _HMG_IsMultiple := IsExeRunning ( StrTran( GetExeFileName (), '\', '_' ) )
|
|
|
Новых ответов нет
, стр:
1
2
3
4
All
[см. все]
|
|