TASK: и START

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

TASK: и START

Postby ebugusey » Wed, 20 Jan 2016, 20:05

Что это за слова? Не могу найти не объявления их в исходниках крона, ни в документации spf.
ebugusey
 
Posts: 8
Joined: Wed, 20 Jan 2016, 20:03

Re: TASK: и START

Postby VoidVolker » Wed, 20 Jan 2016, 20:38

Это в исходниках SP-Forth: win\spf_win_defwords.f и win\spf_win_mtask.f
Используются для создания потока (задачи) и его запуска.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: TASK: и START

Postby ebugusey » Tue, 16 Feb 2016, 14:20

Я помню у меня были проблемы с завершением тредов, текла память, потому что не уничтожалась куча треда. Я написал вот такой каштылик
Code: Select all
   3 CELLS CONSTANT /TID
   : TID CREATE 0 , 0 , 0 , ;

   : TID! ( TID -- )
      GetCurrentThreadId OVER !
      CELL+ THREAD-HEAP @ OVER !
      CUR-NODE ?DUP IF CRON-COUNTER SWAP CELL+ ! ELSE DROP THEN
   ;
   : TID0! ( TID -- ) 0. ROT 2! ;

   : kill-thread ( ThreadId -- ? )
      DUP IF
         DUP 0 1 OpenThread ?DUP IF
            DUP STOP CloseHandle DROP
            S" Thread %0 esPICK% exists, trying to stop..." EVAL-SUBST 2DUP CRON-LOG TYPE CR
            TRUE
         ELSE
            S" Thread %0 esPICK% doesn't exists or error occurred during retrieval of the thread handle"
            EVAL-SUBST 2DUP CRON-LOG TYPE CR
            FALSE
         THEN
      THEN
   ;
   : KILL-THREAD ( TID -- )
      DUP @ kill-thread IF
         DUP CELL+ DUP @
         SWAP CELL+ @ ?DUP IF DUP @ 1- SWAP ! THEN
         SWAP TID0! HeapDestroy ERR THROW
      ELSE DROP THEN
   ;

Я это сделал давно, когда еще только начинал работать с кроном, и не помню сути проблемы. Я все правильно сделал? Существует ли такая проблема или мне тогда показалось, что она существует? Может это баг какой, который не учли в SPF?
ebugusey
 
Posts: 8
Joined: Wed, 20 Jan 2016, 20:03

Re: TASK: и START

Postby ebugusey » Wed, 17 Feb 2016, 13:18

В общем, я покопался в исходниках SPF и немного погуглил.
STOP использует TerminateThread без уничтожения кучи. Описание функции и почему её опасно использовать здесь.
If the target thread is allocating memory from the heap, the heap lock will not be released.

TASK и соответственно все треды (для выполнения задачи, например) в nncron создаются при помощи этого слова
Code: Select all
: EXTERN ( xt1 n -- xt2 )
  HERE
  SWAP LIT,
  ['] FORTH-INSTANCE> COMPILE,
  SWAP COMPILE,
  ['] <FORTH-INSTANCE COMPILE,
  RET,
;

Где FORTH-INSTANCE> это
Code: Select all
: USER-INIT ( n -- )
\ n - размер параметров, к-е Windows передает callback процедуре (в байтах)
  CREATE-HEAP
  <SET-EXC-HANDLER>
  POOL-INIT
  AT-THREAD-STARTING 
;

Ну и соответственно в <FORTH-INSTANCE куча уничтожается. Но когда мы вызываем STOP до этой инструкции выполнение треда не доходит.
Так вот вопрос. Баг это или фича?

Я к чему это все. Я это слово нашел в факе к крону вот здесь и там совершенно не упоминается, что при его использовании начнет течь память.
ebugusey
 
Posts: 8
Joined: Wed, 20 Jan 2016, 20:03

Re: TASK: и START

Postby VoidVolker » Wed, 17 Feb 2016, 13:57

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


Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 6 guests