эксперимент по портированию HINT

Обсуждение программ nnCron и nnCron LITE

Re: эксперимент по портированию HINT

Postby Dark_Jones » Thu, 08 Oct 2009, 07:17

Да, спасибо, заработало!!!
Теперь и винч не будет дёргаться из-за создания дополнительных файлов (которые к тому же не всегда отображаются и копятся в папке крона).
Dark_Jones
 
Posts: 414
Joined: Thu, 09 Nov 2006, 00:43
Location: Russia, S.Peterburg

Re: эксперимент по портированию HINT

Postby Dark_Jones » Sat, 10 Oct 2009, 11:57

Странно... Закрываться перестал. Скопировал плагин и пример заново - не помогло. Меню "Close" появляется, но реакции ни по таймеру, ни по нажатии не происходит. Если делать то, что предлагал Илья, то закрывается, но с ошибкой стека или внутренней ошибкой. :(
Dark_Jones
 
Posts: 414
Joined: Thu, 09 Nov 2006, 00:43
Location: Russia, S.Peterburg

Re: эксперимент по портированию HINT

Postby AlikasS » Sat, 10 Oct 2009, 14:29

обновил первый пост,
у меня он работает
User avatar
AlikasS
 
Posts: 1434
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: эксперимент по портированию HINT

Postby Dark_Jones » Sat, 10 Oct 2009, 15:43

Разобрался: если этот "HINT" использовать в задаче с AsLoggedUser, то не закрывается.
На время вывода "HINT" задача, похоже, останавливается. А после завершения хинта, завершается и недоработавшая до конца задача. ИМХО....
Dark_Jones
 
Posts: 414
Joined: Thu, 09 Nov 2006, 00:43
Location: Russia, S.Peterburg

Re: эксперимент по портированию HINT

Postby AlikasS » Sat, 10 Oct 2009, 16:04

Тогда, можно сделать этот хинт, что бы он запускался отдельным потоком.
это что бы не тормозил задачу.
а по поводу AsLoggedUser надо поэкспериментировать...
User avatar
AlikasS
 
Posts: 1434
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: эксперимент по портированию HINT

Postby Ilya » Sat, 10 Oct 2009, 17:30

AlikasS wrote:Тогда, можно сделать этот хинт, что бы он запускался отдельным потоком.
это что бы не тормозил задачу.
а по поводу AsLoggedUser надо поэкспериментировать...

Вот чего наковырял:
1) Находим метод Flip, а в нем строчку
Code: Select all
dc ReleaseDC DROP
меняем на
Code: Select all
dc handle @ ReleaseDC DROP
- Николай признал очепятку
2) Меняем содержимое TimeOutProc
Code: Select all
:NONAME { time event msg hwnd -- }
   TRUE hwnd HANDLE>OBJ ->CLASS  SplashDialog vClose !

    ; WNDPROC: TimeOutProc

3) Из WM_CREATE выдираем содержимое
Code: Select all
CommColor? 0= IF 0 THEN handle @ GetDC DUP >R SetTextColor DROP
        CommColorBg? 0= IF vBkColor @ THEN R@ SetBkColor DROP
        Font NEW TO CurFont
        CommFont? 0= IF S" MS Sans Serif" THEN DROP CurFont lpszFace !
        CommFontSize? 0= IF 16 THEN CurFont height !
        CurFont Create
        CurFont handle @ R@ SelectObject DROP
        RDROP

и помещаем в метод Create между 0 Create и AutoCreate
Сам WM_CREATE можно удалить.
4) Меняем WM_NCRBUTTONDOWN
Code: Select all
W: WM_NCRBUTTONDOWN
    TRUE vClose !
    ;

5) Если используем меню, то добавляем
Code: Select all
MM: MI_CLOSE
    TRUE vClose !
    ;

И вроде всё работает корректно!

Короче вот:
Code: Select all

    CREATE CommPos  -1 , -1 ,
    CREATE CommSize -1 , -1 ,
    VARIABLE CommColorBg -1 CommColorBg !
    VARIABLE CommColorFont -1 CommColorFont !
    VARIABLE CommFontSize
    CREATE CommFont 256 ALLOT CommFont 0!
    TRUE VALUE BLINK
    : BLINK-OFF FALSE TO BLINK ;
    : BLINK-ON TRUE TO BLINK ;
    MODULE: ~hint
    WINAPI: SelectObject          GDI32.DLL
    WINAPI: GetTextExtentPoint32A GDI32.DLL
    WINAPI: GetDC                 USER32.DLL
    WINAPI: ReleaseDC             USER32.DLL
    WINAPI: CreateBrushIndirect  GDI32.DLL
    WINAPI: CreateRectRgn        GDI32.DLL
    WINAPI: SetTextAlign  GDI32.DLL
    WINAPI: InvertRgn GDI32.DLL

    \ : -pos get-number get-number CommPos 2! ;
    \ : -size get-number get-number CommSize 2! ;
    \ : -bgcolor get-number CommColorBg ! ;
    \ : -color get-number CommColorFont ! ;
    \ : -font get-string CommFont ZPLACE ;
    \ : -fontsize get-number CommFontSize ! ;

    : CommPos? ( -- x y true | -- false)
        CommPos @ -1 =
        IF FALSE ELSE CommPos 2@ TRUE THEN ;
    : CommSize? ( -- w h true | -- false)
        CommSize @ -1 =
        IF FALSE ELSE CommSize 2@ TRUE THEN ;
    : CommColor? ( -- n true | -- false ) CommColorFont @ 0< 0= IF CommColorFont @ TRUE ELSE FALSE THEN ;
    : CommColorBg? ( -- n true | -- false ) CommColorBg @ 0< 0= IF CommColorBg @ TRUE ELSE FALSE THEN ;
    : CommFont? ( -- a u true | -- false ) CommFont C@ IF CommFont ASCIIZ> TRUE ELSE FALSE THEN ;
    : CommFontSize? ( -- n true | -- false ) CommFontSize @ ?DUP IF TRUE ELSE FALSE THEN ;


    \ : PUSH-WINDOW ( hwnd -- prev-hwnd)
    \    DUP SetActiveWindow >R
    \    DUP SetFocus DROP
    \    DUP SetForegroundWindow DROP
    \        BringWindowToTop DROP
    \    R>
    \ ;

    CLASS: SplashClass <SUPER WinClass

    CONSTR: init
         init
         S" nnCron Splash Class" DROP lpszClassName !
         style @ CS_SAVEBITS OR style !
    ;

    ;CLASS

    SplashClass POINTER pSplashClass

    CLASS: SplashDialog <SUPER FrameWindow

    110 VALUE width
    50  VALUE height
    13 CONSTANT but_h
    37 CONSTANT but_w
        var vLines
        var vLen
        var vSplash
        var vTimeOut
        var vCurWin
        var vBkColor
        var vText
        var vMaxLen
        var vHeight
        var vWidth
        var vNL
    \    var handle

    CONSTR: init
        init
        WS_BORDER  WS_POPUP OR  vStyle ! \ кнопка закрыть
        WS_EX_TOPMOST  WS_EX_TOOLWINDOW  OR vExStyle !
    ;

    Font POINTER CurFont

    DESTR: free

        vClass @ TO pSplashClass
        pSplashClass hbrBackground @ DeleteObject DROP
        \ CurFont SELF DELETE
      CurFont Delete
        free
      CR ." free" CR
    ;

    :NONAME { time event msg hwnd -- }
   TRUE hwnd HANDLE>OBJ ->CLASS  SplashDialog vClose !

    ; WNDPROC: TimeOutProc

    W: WM_NCHITTEST  HTCAPTION ;


    VM: Type S" nnCron Splash Class" ;

    : NextLine ( -- a u ? )
        10 SKIP 13 PARSE DUP ?DUP 0=
        IF EndOfChunk 0= THEN ;

    : Center?  CommSize? IF 2DROP TRUE ELSE FALSE THEN ;
    VARIABLE y
    VM: OnPaint
    \   GetRect SP@ pSplashClass hbrBackground @ SWAP dc FillRect . GetLastError . CR
    \  2DROP 2DROP
       Center? IF TA_CENTER dc SetTextAlign DROP THEN
       vText @ ASCIIZ>
       <TIB
            0 y !
            BEGIN NextLine WHILE
                SWAP  2 y @     CommFontSize? 0= IF 8 ELSE 2/ THEN * +
                Center? IF vWidth @ 2/ ELSE 4 THEN
                SWAP ToPixels SWAP dc TextOutA DROP
                y 1+!
            REPEAT
            2DROP
       TIB>
    ;

    102 CONSTANT MI_CLOSE

    MM: MI_CLOSE
    TRUE vClose !
    \ 2 ModalResult! ( BYE )
    ;

    VM: CreatePopup
       POPUPMENU
         S" Close" MI_CLOSE MENUITEM
       END-MENU
    ;

    W: WM_NCRBUTTONDOWN
    TRUE vClose !

    ;

    W: WM_NCLBUTTONDBLCLK
    \    0 S" Hello!!!" DROP DUP 0 MessageBoxA DROP
    \    0
    vText @ ASCIIZ> MsgBox
    \ GetCurrentThreadId  ?DUP
    \    IF
    \        0 1 OpenThread ?DUP
    \        IF STOP THEN
    \    THEN
    ;

    \ W: WM_NCLBUTTONDOWN
    \    0 S" Hello!!!" DROP DUP 0 MessageBoxA DROP
    \    0
    \ ;

    M: BringBack   vCurWin @ PUSH-WINDOW DROP   ;
    : CalcSize ( -- w h)
       vMaxLen 0!
       vNL 0!
       vHeight 0!
       vText @ ASCIIZ>
       <TIB
    \ vNL 1+! \ дополнительная строка для заголовка
            BEGIN NextLine WHILE
               2>R 0 0 SP@ 2R> SWAP handle @ GetDC GetTextExtentPoint32A
               IF
                  DUP vMaxLen @ >
                  IF vMaxLen ! ELSE DROP THEN
                  DUP vHeight @ >
                  IF vHeight ! ELSE DROP THEN
               ELSE 2DROP THEN
               vNL 1+!
            REPEAT
            2DROP
       TIB>
       vHeight @ vNL @ * vHeight !
       vMaxLen @ vHeight @  FromPixels
       5 + vHeight !
       10 + vWidth !
       vWidth @ vHeight @
    ;
    M: SET-SIZE ( w h -- )
        CommSize?
        IF 2SWAP 2DROP FromPixels 2DUP vHeight ! vWidth ! THEN
        SetSize ;

    M: Create
        GetForegroundWindow vCurWin !
        SplashClass NEW TO pSplashClass
        0 ( 0xEE 0xE8 0xAA rgb) CommColorBg? 0= IF COLOR_INFOBK GetSysColor THEN DUP vBkColor !
            BS_SOLID SP@ CreateBrushIndirect  pSplashClass hbrBackground !
        2DROP DROP

        pSplashClass Register DROP

        pSplashClass SELF vClass !
        0 Create
      CommColor? 0= IF 0 THEN handle @ GetDC DUP >R SetTextColor DROP
        CommColorBg? 0= IF vBkColor @ THEN R@ SetBkColor DROP
        Font NEW TO CurFont
        CommFont? 0= IF S" MS Sans Serif" THEN DROP CurFont lpszFace !
        CommFontSize? 0= IF 16 THEN CurFont height !
        CurFont Create
        CurFont handle @ R@ SelectObject DROP
        RDROP
        AutoCreate
        vTimeOut @
        IF ['] TimeOutProc vTimeOut @ 1000 * 123 handle @ SetTimer DROP THEN

        CalcSize CommPos?
        IF SetPos SET-SIZE
        ELSE
            2DUP ToPixels GetDesktopSize
                ROT  - 30 - 0 MAX >R
                SWAP - 30 - 0 MAX R> SetPos
            SET-SIZE
            \ Center
       THEN

    \    S" nnCron ~HINT window" SetText
    ;

    M: MoveToHome { \ xt yt x0 y0 hy hx nstep yrest xrest -- }
        CommPos? 0=
        IF
            GetPos TO y0 TO x0
            vWidth @ vHeight @ ToPixels DROP GetDesktopSize DROP SWAP - 30 - 0 MAX 30
            TO yt TO xt
            20 TO nstep
            xt x0 - nstep / TO hx
            yt y0 - nstep / TO hy
            nstep 1+ 1 DO x0 I hx * + y0 I hy * + SetPos 10 PAUSE LOOP
        xt yt
        THEN
        SetPos
    ;

    M: Flip { \ dc rgn -- }
        handle @ UpdateWindow DROP
        handle @ GetDC TO dc
        GetWindowSize SWAP 0 0 CreateRectRgn TO rgn
        rgn dc SelectObject DROP
        4 0 DO BLINK IF rgn dc InvertRgn DROP THEN 100 PAUSE LOOP \ заккомент инвертирование
        rgn DeleteObject DROP
        dc handle @ ReleaseDC DROP
    ;

    M: Text ( a u --)
       S>ZALLOC vText !
    ;
    VM: OnExit
    TRUE vClose !
    ;

    W: WM_CLOSE
       TRUE vClose !
    ;
    ;CLASS

    SplashDialog POINTER msg

    EXPORT
    : (TimeSplash) ( time a u --)
        2>R
        SplashDialog NEW TO msg
        msg vTimeOut !
        2R> msg Text
        msg Create
        msg Show
        msg BringBack
       msg Flip
        msg MoveToHome
        msg Run
        msg Delete
    ;
    ;MODULE
Ilya
 
Posts: 443
Joined: Mon, 07 Aug 2006, 09:51
Location: Санкт-Петербург

Re: эксперимент по портированию HINT

Postby Dark_Jones » Sat, 10 Oct 2009, 20:10

AlikasS wrote:Тогда, можно сделать этот хинт, что бы он запускался отдельным потоком.


Сделал так (сразу скажу - в отдельных потоках и GUI ничего не понимаю, так что можете смеяться):
Code: Select all
: (TimeSplashWait) ( time a u --)
    2>R
    SplashDialog NEW TO msg
    msg vTimeOut !
    2R> msg Text
    msg Create
    msg Show
    msg BringBack   
    msg Flip
    msg MoveToHome
    msg Run
    msg Delete
;

:NONAME
adr->3num (TimeSplashWait)
\ TERMINATE
; TASK: (TimeSplashW)

: (TimeSplash) ( time a u --)
save3num->adr (TimeSplashW) START DROP
;

Добавил в конец плагина до ;MODULE
Естественно не заработало. То есть выводит и не тормозит задачу, но держит больше, чем "time"; подозреваю, что некорректно завершается поток; не всегда закрывается правой кнопкой если вывести десяток одинаковых хинтов.

Дополнительные слова:
Code: Select all
: save3num->adr HERE ! HERE CELL+ ! HERE 2 CELLS + ! HERE ;
: adr->3num DUP @ SWAP CELL+ DUP @ SWAP CELL+ @ ;


Проверял так:
Code: Select all
#( Test_hint
\ AsLoggedUser
LoadProfile
WatchHotKey: "^(@t)"
Action:
BLINK-OFF
S" начало" CRON-LOG
S" Хинт сам пропадёт" 5 ROT ROT (TimeSplash)
S" конец" CRON-LOG
)#
Dark_Jones
 
Posts: 414
Joined: Thu, 09 Nov 2006, 00:43
Location: Russia, S.Peterburg

Re: эксперимент по портированию HINT

Postby VoidVolker » Sat, 10 Oct 2009, 21:02

Вот чтобы и не возиться с потоками проще отдельной программой :)
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: эксперимент по портированию HINT

Postby AlikasS » Sun, 11 Oct 2009, 04:38

запуск отдельным потоком
Code: Select all
\ здесь все то же, что и раньше
    SplashDialog POINTER msg

: save2num->adr ( id pause  -- adr ) HERE ROT , SWAP , DUP DP ! ;
: adr->2num ( adr -- id pause ) DUP @ SWAP CELL+ @ ;

:NONAME
adr->2num
ASCIIZ>
        2>R
        SplashDialog NEW TO msg
        msg vTimeOut !

        2R> msg Text
        msg Create
        msg Show
        msg BringBack
       msg Flip
        msg MoveToHome
        msg Run
        msg Delete
; TASK: ~(TimeSplash)
EXPORT
: (TimeSplash)  ( time a u --)
 S>ZALLOC save2num->adr ~(TimeSplash) START DROP ;
;MODULE

еще можно в месте
~(TimeSplash) START DROP ;

не делать DROP, а добавлять значение в какой-нибудь список,
для того что бы можно было сделать всеобщий хинт-OFF
User avatar
AlikasS
 
Posts: 1434
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: эксперимент по портированию HINT

Postby Dark_Jones » Sun, 11 Oct 2009, 10:52

Работает. Но если накидать кучу хинтов, то крон начинает сыпать ошибки (4-5 хинтов - выведут "внутреннюю ошибку").
Этакая DoS атака получается, но что-то слишком рано крон сдаётся...
Dark_Jones
 
Posts: 414
Joined: Thu, 09 Nov 2006, 00:43
Location: Russia, S.Peterburg

Re: эксперимент по портированию HINT

Postby Ilya » Sun, 11 Oct 2009, 11:07

Dark_Jones wrote:Работает. Но если накидать кучу хинтов, то крон начинает сыпать ошибки (4-5 хинтов - выведут "внутреннюю ошибку").
Этакая DoS атака получается, но что-то слишком рано крон сдаётся...

Друзья! Обратите внимание на мой предыдущий пост -там реализовано "правильное" закрытие хинта + поправлена очепятка.
Ilya
 
Posts: 443
Joined: Mon, 07 Aug 2006, 09:51
Location: Санкт-Петербург

Re: эксперимент по портированию HINT

Postby Dark_Jones » Sun, 11 Oct 2009, 11:20

Ilya wrote:Друзья! Обратите внимание на мой предыдущий пост -там реализовано "правильное" закрытие хинта + поправлена очепятка.


Его я и использовал... :oops:
Вчера всё работало, или я его так не мучал - не помню.
Теперь один хинт работает, а два (ожидающих хинта) - при закрытии первого вызывают "внутренняя ошибка. Параметр задан неверно".
Dark_Jones
 
Posts: 414
Joined: Thu, 09 Nov 2006, 00:43
Location: Russia, S.Peterburg

Re: эксперимент по портированию HINT

Postby Ilya » Sun, 11 Oct 2009, 11:42

Dark_Jones wrote:
Ilya wrote:Друзья! Обратите внимание на мой предыдущий пост -там реализовано "правильное" закрытие хинта + поправлена очепятка.


Его я и использовал... :oops:
Вчера всё работало, или я его так не мучал - не помню.
Теперь один хинт работает, а два (ожидающих хинта) - при закрытии первого вызывают "внутренняя ошибка. Параметр задан неверно".

Понял! На много-хинтовость не проверял! :?
Есть кое-какие мыслишки (как мин. в деструкторе надо добавить удаление таймера ).
Можно твой пример для дальнейшей отработки?
Ilya
 
Posts: 443
Joined: Mon, 07 Aug 2006, 09:51
Location: Санкт-Петербург

Re: эксперимент по портированию HINT

Postby Dark_Jones » Sun, 11 Oct 2009, 20:21

Ilya wrote:Можно твой пример для дальнейшей отработки?

Он уже есть (в конце этого поста):
viewtopic.php?f=5&t=10144&p=23289#p23232

ROT ROT использовал для совместимости с THINT...
Dark_Jones
 
Posts: 414
Joined: Thu, 09 Nov 2006, 00:43
Location: Russia, S.Peterburg

Re: эксперимент по портированию HINT

Postby Ilya » Sun, 11 Oct 2009, 23:20

Dark_Jones wrote:
Ilya wrote:Можно твой пример для дальнейшей отработки?

Он уже есть (в конце этого поста):
viewtopic.php?f=5&t=10144&p=23289#p23232

ROT ROT использовал для совместимости с THINT...

Да! Ситуация нетривиальная. :( Бум разбираться!
Ilya
 
Posts: 443
Joined: Mon, 07 Aug 2006, 09:51
Location: Санкт-Петербург

PreviousNext

Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 1 guest