Автор | Сообщение |
|
| |
Пост N: 329
Зарегистрирован: 08.07.06
|
|
Отправлено: 13.10.13 22:54. Заголовок: Почему CTRL-BREAK срубает Harbour ?
В процессе расследования "необъяснимых" вылетов программы родилась мысль: при запуске программы запускать вторую ее копию. Это чтобы не муздыкаться с батниками, всякими loader.exe и прочими вариантами на множестве рабочих мест. Первая копия дожидается завершения второй копии, сохраняет содержимое экрана в лог и завершает работу, как ни в чем не бывало. Во время "домашнего" тестирования всё работало прекрасно, пока я не наткнулся на комбинацию кнопок CTRL-BREAK. Мало того, что ей чихать на установку SETCANCEL(FALSE), так еще получается, что вырубаются оба приложения: и родительское и вторая его копия. Т.е. копия экрана не создается ни при каких условиях, если в вызванном приложении нажата эта комбинация... Простой пример: Скрытый текст
#define CRLF CHR(13)+CHR(10) #define TRUE .T. FUNC Main() LOCAL i SETCANCEL(.F.) //doesn't matter ? Call2nd() CLEAR SCREEN FOR i:=8 TO 15 @ i,i SAY "Hello, world." NEXT i @ 20,10 SAY "If you press any key - screen will be logged, if CTRL-BREAK - not. Why?" INKEY(0) RETURN * ----------------- * STATIC FUNC Call2nd() LOCAL sx:=DOSPARAM(),fname:="screen.log",i,s IF ("/2nd" $ sx) RETURN ENDIF RUN(EXENAME()+" "+sx+" /2nd") Alert("Program terminated, screen saved.") STRFILE(CRLF+PADC(" Screen capture: "+DTOC(DATE())+" "+TIME()+" ",MAXCOL()+1,CHR(196))+CRLF,fname,TRUE) FOR i:=0 TO MAXROW() s:=CHARODD(SAVESCREEN(i,0,i,MAXCOL())) IF !EMPTY(s) STRFILE(s+CRLF,fname,TRUE) ENDIF NEXT i STRFILE(REPL(CHR(196),MAXCOL()+1)+CRLF,fname,TRUE) QUIT RETURN
|
|
|
|
Ответов - 16
[только новые]
|
|
|
| |
Пост N: 948
Зарегистрирован: 11.06.10
|
|
Отправлено: 14.10.13 08:37. Заголовок: Хотел протестировать..
Хотел протестировать, но получил d:/tmp/hbmk_8ecjyv.dir/serg.o:serg.c:(.data+0x88): undefined reference to `HB_FUN_DOSPARAM' d:/tmp/hbmk_8ecjyv.dir/serg.o:serg.c:(.data+0xa8): undefined reference to `HB_FUN_EXENAME' d:/tmp/hbmk_8ecjyv.dir/serg.o:serg.c:(.data+0x88): undefined reference to `HB_FUN_STRFILE' d:/tmp/hbmk_8ecjyv.dir/serg.o:serg.c:(.data+0xe8): undefined reference to `HB_FUN_CHARODD' c:/mingw/bin/../lib/gcc/mingw32/4.7.2/../../../../mingw32/bin/ld.exe: d:/tmp/hbmk_8ecjyv.dir/serg.o: bad reloc address 0xf in section `.text.startup' c:/mingw/bin/../lib/gcc/mingw32/4.7.2/../../../../mingw32/bin/ld.exe: final link failed: Invalid operation collect2.exe: error: ld returned 1 exit status Давайте начинать с самодостаточных примеров, скомпилил, запустил, посмотрел результат, а уж потом добавлять другие ф-и.
|
|
|
|
| |
Пост N: 330
Зарегистрирован: 08.07.06
|
|
Отправлено: 14.10.13 10:19. Заголовок: Эти функции из Clipe..
Эти функции из Clipper Tools, ныне hbct. Я обычно все свои примеры компилирую так: hbmk2 test.prg -prgflag=/v d:\harbour\contrib\hbct\hbct.hbc, поэтому забыл. Сорри.
|
|
|
|
| |
Пост N: 949
Зарегистрирован: 11.06.10
|
|
Отправлено: 14.10.13 10:45. Заголовок: Собирать можно так h..
Собирать можно так hbmk2 test.prg -prgflag=/v hbct.hbc Под терминалом gtwvt тестировали?
|
|
|
|
| |
Пост N: 3626
Зарегистрирован: 17.05.05
|
|
Отправлено: 14.10.13 10:54. Заголовок: AlexMyr пишет: Под ..
AlexMyr пишет: цитата: | Под терминалом gtwvt тестировали? |
| Под ним нет такого эффекта.
|
|
|
|
| |
Пост N: 331
Зарегистрирован: 08.07.06
|
|
Отправлено: 14.10.13 11:00. Заголовок: AlexMyr пишет: Соби..
AlexMyr пишет: цитата: | Собирать можно так hbmk2 test.prg -prgflag=/v hbct.hbc Под терминалом gtwvt тестировали? |
| Работаю под GTWIN. Знаю о "вкусностях" второго терминала, но хочу для начала полностью перейти с Clipper на Harbour - сделать стабильное и надежное приложение. После чего заняться апгрейдом программы на полную катушку.
|
|
|
|
| |
Пост N: 950
Зарегистрирован: 11.06.10
|
|
Отправлено: 14.10.13 11:16. Заголовок: Заменил RUN на hb_pr..
Заменил RUN на hb_processRun, стал появляться screen.log
|
|
|
|
| |
Пост N: 332
Зарегистрирован: 08.07.06
|
|
Отправлено: 14.10.13 11:51. Заголовок: AlexMyr пишет: Заме..
AlexMyr пишет: цитата: | Заменил RUN на hb_processRun, стал появляться screen.log |
| У меня нет пока возможности проверить, скажите пожалуйста: в логе есть Harbour сообщение "Cancelled at ..." и стек вызовов (как обычно) ? Alert появляется ? Спасибо.
|
|
|
|
| |
Пост N: 951
Зарегистрирован: 11.06.10
|
|
Отправлено: 14.10.13 11:56. Заголовок: Вот что в screen.log..
Вот что в screen.log ────────────────────── Screen capture: 10/14/13 11:54:48 ─────────────────────── C:\prg_hrb\test\sergy\>serg.exe ──────────────────────────────────────────────────────────────────────────────── Sergy пишет: Да.
|
|
|
|
| |
Пост N: 333
Зарегистрирован: 08.07.06
|
|
Отправлено: 14.10.13 12:20. Заголовок: AlexMyr пишет: Вот ..
AlexMyr пишет: цитата: | Вот что в screen.log ────────────────────── Screen capture: 10/14/13 11:54:48 ─────────────────────── C:\prg_hrb\test\sergy\>serg.exe ──────────────────────────────────────────────────────────────────────────────── |
| У меня получилось аналогично. Все хорошо, но где содержимое экрана ?
|
|
|
|
| |
Пост N: 952
Зарегистрирован: 11.06.10
|
|
Отправлено: 14.10.13 12:22. Заголовок: Sergy пишет: Все хо..
Sergy пишет: цитата: | Все хорошо, но где содержимое экрана ? |
|
валится вторая задача, потому содержимое первого экрана.
|
|
|
|
| |
Пост N: 334
Зарегистрирован: 08.07.06
|
|
Отправлено: 14.10.13 12:33. Заголовок: AlexMyr пишет: вали..
AlexMyr пишет: цитата: | валится вторая задача, потому содержимое первого экрана. |
| Тут я не очень понимаю. Почему тогда на экране строки "Hello world" видны (в момент Alert()), а SAVESCREEN вызывашей задачи не может их забрать к себе ? Почему он может это сделать, если не был нажат CTRL-BREAK ?
|
|
|
|
|
| |
Пост N: 3627
Зарегистрирован: 17.05.05
|
|
Отправлено: 14.10.13 14:12. Заголовок: Sergy пишет: Почему..
Sergy пишет: цитата: | Почему он может это сделать, если не был нажат CTRL-BREAK ? |
| При нажатии любой клавиши снимок экрана так же пуст и все после замены RUN на hb_processRun. Оно как бы и понятно почему , так как hb_processRun выполняется в отдельном окне.
|
|
|
|
| |
Пост N: 335
Зарегистрирован: 08.07.06
|
|
Отправлено: 14.10.13 14:36. Заголовок: Dima пишет: При наж..
Dima пишет: цитата: | При нажатии любой клавиши снимок экрана так же пуст и все после замены RUN на hb_processRun. |
| +1 Обнаружил тоже самое. цитата: | Оно как бы и понятно почему , так как hb_processRun выполняется в отдельном окне. |
| А вот это - не очень понятно. У меня все четко, один процесс запускает другой: Только в случае с "обычным" RUN() или __Run() между двумя задачами возникает прослойка в виде cmd.exe
|
|
|
|
| |
Пост N: 336
Зарегистрирован: 08.07.06
|
|
Отправлено: 14.10.13 17:50. Заголовок: Сделал так: ------..
Сделал так: Скрытый текст
--------------------- i2test.prg ------------------ #define CRLF CHR(13)+CHR(10) #define TRUE .T. FUNC Main() LOCAL i SETCANCEL(.F.) IF "/save" $ DOSPARAM() SavePrevConsole() ELSE CLEAR SCREEN FOR i:=8 TO 15 @ i,i SAY "Hello, world." NEXT i @ 20,10 SAY "If you press any key - screen will be saved, if CTRL-BREAK - may be yes or not. Why?" INKEY(0) ENDIF RETURN * ------------------------- * STATIC FUNC SavePrevConsole() LOCAL fname:="report.!!!",i,s STRFILE(CRLF+PADC(" Screen capture: "+DTOC(DATE())+" "+TIME()+" ",MAXCOL()+1,CHR(196))+CRLF,fname,TRUE) FOR i:=0 TO MAXROW() s:=CHARODD(SAVESCREEN(i,0,i,MAXCOL())) IF !EMPTY(s) STRFILE(s+CRLF,fname,TRUE) ENDIF NEXT i STRFILE(REPL(CHR(196),MAXCOL()+1)+CRLF,fname,TRUE) ? "Program terminated, screen saved" WAIT RETURN --------------------- loader.prg ------------------ FUNC Main() HB_ProcessRUN("i2test.exe") HB_ProcessRUN("i2test.exe /save") RETURN
| Что получается: если вызывать программу через RUN() - CTRL-BREAK рубит все подряд. Если вызывать два экзешника через батник - появляется вопрос: "Завершить выполнение бат-файла [Да/нет]?" и в зависимости от результата, экран сохраняется или нет. Если вызывать через HB_ProcessRun() - все работает ок. Пофигу, какие кнопки нажаты.
|
|
|
|
| |
Пост N: 338
Зарегистрирован: 08.07.06
|
|
Отправлено: 14.10.13 18:02. Заголовок: Сделал так: loader...
Сделал так: loader.prg: FUNC Main() HB_ProcessRUN("i2test.exe") STRFILE(CHARODD(SAVESCREEN()),"loader.!!!") // тест HB_ProcessRUN("i2test.exe /save") RETURN Почему так получается, что из программы loader.exe SAVESCREEN "не видит" содержимого экрана (loader.!!! пустой, там только c:\path\loader.exe внизу), а из другого процесса - все ок ???
|
|
|
|
| |
Пост N: 339
Зарегистрирован: 08.07.06
|
|
Отправлено: 14.10.13 18:24. Заголовок: Вот так все работает..
Вот так все работает, пофиг на CTRL-BREAK, только мне совсем непонятно, почему... Скрытый текст
#define CRLF CHR(13)+CHR(10) #define TRUE .T. FUNC Main() SETCANCEL(.F.) IF "/save" $ DOSPARAM() SavePrevConsole() ELSEIF "/do" $ DOSPARAM() DoSomething() ELSE HB_ProcessRun(EXENAME()+" /do") HB_ProcessRun(EXENAME()+" /save") ENDIF RETURN * --------------------- * STATIC FUNC DoSomething() LOCAL i CLEAR SCREEN FOR i:=8 TO 15 @ i,i SAY "Hello, world." NEXT i @ 20,10 SAY "If you press any key - screen will be saved, if CTRL-BREAK - not. Why?" INKEY(0) RETURN * ------------------------- * STATIC FUNC SavePrevConsole() LOCAL fname:="report.!!!",i,s STRFILE(CRLF+PADC(" Screen capture: "+DTOC(DATE())+" "+TIME()+" ",MAXCOL()+1,CHR(196))+CRLF,fname,TRUE) FOR i:=0 TO MAXROW() s:=CHARODD(SAVESCREEN(i,0,i,MAXCOL())) IF !EMPTY(s) STRFILE(s+CRLF,fname,TRUE) ENDIF NEXT i STRFILE(REPL(CHR(196),MAXCOL()+1)+CRLF,fname,TRUE) ? "Program terminated, screen saved" WAIT RETURN // EOF here
|
|
|
|
|