Автор | Сообщение |
|
| |
Пост N: 4326
Зарегистрирован: 17.05.05
|
|
Отправлено: 10.12.14 16:59. Заголовок: Пара простых вопросов ;)
1. Как узнать что путь к папке из которой запускается программа имеет символы кирилицы ? На ум приходит такой способ proc main() local a REQUEST HB_LANG_RU866 HB_LANGSELECT("RU866") REQUEST HB_CODEPAGE_RU866 hb_cdpSelect( "RU866" ) a:=curdir() ? a if hb_oemtoansi(a)#a ? "Есть кирилица" endif wait RETURN NIL Есть еще метода ? 2. Как узнать что путь к папке из которой запускается программа имеет длинные имена ? На вскидку приходит вариант разбить на токены с разделителем "\" и затем чекать длины всех токенов. Есть еще метода ?
|
|
|
Ответов - 85
, стр:
1
2
3
4
5
All
[только новые]
|
|
|
| |
Пост N: 4356
Зарегистрирован: 17.05.05
|
|
Отправлено: 14.12.14 19:05. Заголовок: Haz Спасибо мастеру..
Haz Спасибо мастеру по регулярным выражениям ! ;) Да так подойдет. Описания что то не нашел я на hb_RegExSplit , интересная функция.
|
|
|
|
| |
Пост N: 4357
Зарегистрирован: 17.05.05
|
|
Отправлено: 14.12.14 19:18. Заголовок: Haz пишет: |..
Haz пишет: Игорь извини что дергаю в выходной. Что означает эта пара символов ?
|
|
|
|
| |
Пост N: 401
Зарегистрирован: 20.02.11
|
|
Отправлено: 14.12.14 19:35. Заголовок: Dima пишет: Что озн..
Dima пишет: цитата: | Что означает эта пара символов |
| | - это знак или \ - это модификатор который говорит что . ( точка ) не любой один символ а именно точка на счет мастера ты погорячился я сам их редко применяю и все время со шпаргалками hb_RegExSplit у Александра на сайте есть http://www.kresin.ru/hrbfaq_3.html#Doc9
|
|
|
|
| |
Пост N: 4358
Зарегистрирован: 17.05.05
|
|
Отправлено: 14.12.14 19:52. Заголовок: OK. Спасибо..
OK. Спасибо
|
|
|
|
| |
Пост N: 4704
Зарегистрирован: 17.05.05
|
|
Отправлено: 09.04.15 21:44. Заголовок: В функции работающей..
В функции работающей(добавленной) через HB_IDLEADD() можно завершить работу основной программы через QUIT он же __Quit() . Попробовал тоже самое сделать в функции запущенной в отдельном потоке. Не получилось и QUIT просто заканчивает работу данного потока. Что логично. Вопрос: возможно ли из отдельного потока завершить работу основной программы ?
|
|
|
|
| moderator
|
Пост N: 907
Зарегистрирован: 06.07.06
|
|
Отправлено: 10.04.15 09:30. Заголовок: Dima пишет: Вопрос:..
Dima пишет: цитата: | Вопрос: возможно ли из отдельного потока завершить работу основной программы ? |
| По-видимому, нельзя. Надо при необходимости отправить сообщение основному потоку ( через общую переменную, например ), ну а он и завершит.
|
|
|
|
| |
Пост N: 4706
Зарегистрирован: 17.05.05
|
|
Отправлено: 10.04.15 10:39. Заголовок: alkresin пишет: ( ч..
alkresin пишет: цитата: | ( через общую переменную, например ), ну а он и завершит |
| Как тогда отслеживать эту переменную в основном потоке ? Повесить функцию через Hb_idleadd() или как то иначе ...
|
|
|
|
| |
Пост N: 444
Зарегистрирован: 08.07.06
|
|
Отправлено: 10.04.15 10:47. Заголовок: Как вариант - отслеж..
Как вариант - отслеживать наличие "нужного" потока (который посылает команду на завершение приложения). Как только он "кончился" - завершать основную программу.
|
|
|
|
| moderator
|
Пост N: 909
Зарегистрирован: 06.07.06
|
|
Отправлено: 10.04.15 11:54. Заголовок: Dima пишет: Повесит..
Dima пишет: цитата: | Повесить функцию через Hb_idleadd() |
| В консоли - наверное, так. В GUI - таймеры есть.
|
|
|
|
| |
Пост N: 4709
Зарегистрирован: 17.05.05
|
|
Отправлено: 10.04.15 13:25. Заголовок: alkresin пишет: В G..
alkresin пишет: Как в Минигуи например C:\MiniGUI\SOURCE\c_timer.c ? А его можно использовать в консоли ?
|
|
|
|
| moderator
|
Пост N: 912
Зарегистрирован: 06.07.06
|
|
Отправлено: 10.04.15 13:37. Заголовок: А его можно использо..
цитата: | А его можно использовать в консоли ? |
| Вопрос интересный. Не знаю, как именно это сделано в Minigui и можно ли использовать тот код напрямую, но что-то свое на его основе написать можно.
|
|
|
|
|
| moderator
|
Пост N: 913
Зарегистрирован: 06.07.06
|
|
Отправлено: 10.04.15 14:17. Заголовок: Попробовал сейчас, п..
Попробовал сейчас, получилось: Скрытый текст function main() local s := " " ANNOUNCE HB_GTSYS request HB_GT_WVT REQUEST HB_GT_WVT_DEFAULT #include "hbgtinfo.ch" hb_gtinfo( HB_GTI_FONTWIDTH, Int( hb_gtinfo( HB_GTI_DESKTOPWIDTH ) / 80 ) ) hb_gtinfo( HB_GTI_FONTSIZE, Int( ( hb_gtinfo( HB_GTI_DESKTOPHEIGHT ) - 64 ) / 25 ) ) hb_gtinfo( HB_GTI_CLOSABLE, .F. ) clear screen xxx_settimer( 1000 ) @ 1,1 GET s READ xxx_killtimer() return nil Function xxx_timerproc() static nn := 0 nn ++ @ 1,20 say str(nn) Return Nil #pragma BEGINDUMP #include <windows.h> #include "hbapi.h" HWND handle; void wrlog( const char * sFile, const char * sTraceMsg, ... ) { FILE *hFile; if( sFile == NULL ) { hFile = hb_fopen( "ac.log", "a" ); } else { hFile = hb_fopen( sFile, "a" ); } if( hFile ) { va_list ap; va_start( ap, sTraceMsg ); vfprintf( hFile, sTraceMsg, ap ); va_end( ap ); fclose( hFile ); } } static void CALLBACK s_timerProc( HWND hWnd, UINT message, UINT idTimer, DWORD dwTime ) { static PHB_DYNS s_pSymTest = NULL; HB_SYMBOL_UNUSED( message ); if( s_pSymTest == NULL ) s_pSymTest = hb_dynsymGetCase( "XXX_TIMERPROC" ); wrlog( NULL,"proc-1" ); if( hb_dynsymIsFunction( s_pSymTest ) ) { wrlog( NULL,"proc-2" ); hb_vmPushDynSym( s_pSymTest ); hb_vmPushNil(); hb_vmPushLong( ( LONG ) idTimer ); hb_vmPushLong( ( LONG ) dwTime ); hb_vmDo( 2 ); } } HB_FUNC( XXX_SETTIMER ) { handle = GetActiveWindow(); SetTimer( handle, 1001, ( UINT ) hb_parni( 1 ), s_timerProc ); } HB_FUNC( XXX_KILLTIMER ) { KillTimer( handle, 1001 ); } #pragma ENDDUMP
| Но это не работает с gtwin, т.к. там нет окна. Нужен gtwvt или что-то вроде этого.
|
|
|
|
| |
Пост N: 4710
Зарегистрирован: 17.05.05
|
|
Отправлено: 10.04.15 14:22. Заголовок: Сейчас попробую. GTW..
Сейчас попробую. Да работает примерчик. Спасибо. GTWIN не использую. А я пробовал так. Срабатывает , но почему то однократно. Почему ? REQUEST HB_GT_WVT REQUEST HB_GT_WVG Proc main local hwnd cls hwnd:=GetForegroundWindow() INITTIMER(hwnd,"TEST",100,My_test()) wait KILLTIMER(hwnd,"TEST") return ****************** Func My_test() @ 3,2 say seconds() return nil ****************** #pragma BEGINDUMP #include <windows.h> #include <hbapi.h> HB_FUNC (GETFOREGROUNDWINDOW) { HWND hWnd = GetForegroundWindow(); hb_retnl ((LONG) hWnd); } HB_FUNC( INITTIMER ) { hb_retl( SetTimer( ( HWND ) hb_parnl( 1 ), ( UINT ) hb_parni( 2 ), ( UINT ) hb_parni( 3 ), ( TIMERPROC ) NULL ) ); } HB_FUNC( KILLTIMER ) { KillTimer( ( HWND ) hb_parnl( 1 ), // handle of main window ( UINT ) hb_parni( 2 ) ); // timer identifier } #pragma ENDDUMP
|
|
|
|
| moderator
|
Пост N: 914
Зарегистрирован: 06.07.06
|
|
Отправлено: 10.04.15 15:19. Заголовок: Таймер в в вашем при..
Таймер в в вашем примере не срабатывает ни разу, т.к. в inittimer() не определена callback процедура, NULL стоит. А один раз срабатывает my_test() при вызове initimer() - ему передается значение, возвращаемое my_test()
|
|
|
|
| |
Пост N: 4711
Зарегистрирован: 17.05.05
|
|
Отправлено: 10.04.15 15:30. Заголовок: Вот так правильно бу..
Вот так правильно будет ? HB_FUNC( INITTIMER ) { hb_retl( SetTimer( ( HWND ) hb_parnl( 1 ), ( UINT ) hb_parni( 2 ), ( UINT ) hb_parni( 3 ), ( TIMERPROC ) hb_parni( 4 ) ) ); } В Си я конечно валенок ;)
|
|
|
|
| moderator
|
Пост N: 915
Зарегистрирован: 06.07.06
|
|
Отправлено: 10.04.15 15:46. Заголовок: Dima пишет: Вот так..
Dima пишет: цитата: | Вот так правильно будет ? |
| Нет, конечно. Inittimer должен быть такой, как в моем примере. А если вы хотите передать процедуру обработки прерывания от таймера, то надо это делать на Harbour уровне - как в Hwgui, да и в Minigui, наверное, так же. Вам надо привязать эту процедуру, например, к id ( 2-й параметр в вызове settimer() ) - поместить в массив, например, соответсвующие id и кодоблок процедуры - а затем из callback-функции найти этот кодоблок по id и выполнить.
|
|
|
|
| |
Пост N: 4712
Зарегистрирован: 17.05.05
|
|
Отправлено: 10.04.15 15:48. Заголовок: Has подсказал. Свая..
Has подсказал. Сваял примерчик , работает. Proc main REQUEST HB_GT_WVT cls Wvt_SetTimer( 2, 200) wait Wvt_KillTimer(2) return ************* Func WVT_TIMER() @ 10,0 say time() return .t.
|
|
|
|
| |
Пост N: 4713
Зарегистрирован: 17.05.05
|
|
Отправлено: 10.04.15 17:09. Заголовок: alkresin Александр ..
alkresin Александр у меня вопрос. Функции xxx_settimer() , xxx_killtimer() , xxx_timerproc() или Wvt_SetTimer() , Wvt_KillTimer() , WVT_TIMER() это из той же оперы что и HB_IDLEADD() или это "родственники" потоков или что то еще ? Почему спрашиваю. Допустим есть функция которая была добавлена в HB_IDLEADD() и срабатывает каждые 200 мск да еще что то выводит на экран ("для крутости") , так вот в основной программе я получу тормоза. Если тоже самое сделать через поток , тормозов нет.
|
|
|
|
| moderator
|
Пост N: 916
Зарегистрирован: 06.07.06
|
|
Отправлено: 10.04.15 19:17. Заголовок: Dima пишет: это из ..
Dima пишет: цитата: | это из той же оперы что и HB_IDLEADD() или это "родственники" потоков или что то еще ? |
| Что-то еще. Насколько я понимаю, считает время и организует прерывание отдельный системный процесс, а обрабатывается это прерывание во время idle state. цитата: | Допустим есть функция которая была добавлена в HB_IDLEADD() и срабатывает каждые 200 мск да еще что то выводит на экран ("для крутости") , так вот в основной программе я получу тормоза. |
| Возможно, проблема в реализации этой функции, может, ее надо реже вызывать.
|
|
|
|
| |
Пост N: 4714
Зарегистрирован: 17.05.05
|
|
Отправлено: 10.04.15 21:27. Заголовок: alkresin пишет: Воз..
alkresin пишет: цитата: | Возможно, проблема в реализации этой функции |
| Так и есть , мой косяк. Спасибо за подсказку
|
|
|
Ответов - 85
, стр:
1
2
3
4
5
All
[только новые]
|
|