Author Topic: Полная остановка потока  (Read 4110 times)

0 Members and 1 Guest are viewing this topic.

MerlinUA

  • Зашел в гости
  • *
  • Posts: 7
    • View Profile
Полная остановка потока
« on: December 02, 2015, 09:30:01 PM »
Всем доброго времени суток, вот мучаюсь, как полностью остановить поток.
Нужно начать работу потока сначала, а не приостанивить, а позже возобновить его, как это реализовано в кликере. Помогите, пожалуйста, кто сталкивался!

Code: (clickermann) [Select]
THREAD(thr_name,1)
   LOGWRITE("1")
   WAIT(1)
   LOGWRITE("2")
   WAIT(1)
   LOGWRITE("3")
   WAIT(1)
   LOGWRITE("4")
   WAIT(1)
   LOGWRITE("5")
   WAIT(1)
   LOGWRITE("6")
   waitms(10)
END_THREAD
WAIT(3)
SETTHREAD(thr_name,0)
WAIT(1)
LOGWRITE("ОСНОВНОЙ ПОТОК")
WAIT(1)
SETTHREAD(thr_name,1)
WAIT(5)
halt

Что получилось:

8:25:17 PM 1
8:25:18 PM 2
8:25:19 PM 3
8:25:20 PM 4
8:25:21 PM Основной поток
8:25:22 PM 5
8:25:23 PM 6

Что должно получиться:

8:25:17 PM 1
8:25:18 PM 2
8:25:19 PM 3
8:25:20 PM 4
8:25:21 PM Основной поток
8:25:22 PM 1
8:25:23 PM 2

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Полная остановка потока
« Reply #1 on: December 02, 2015, 10:00:28 PM »
Никак не реализовано пока, доступна только пауза.

MerlinUA

  • Зашел в гости
  • *
  • Posts: 7
    • View Profile
Re: Полная остановка потока
« Reply #2 on: December 02, 2015, 10:32:09 PM »
Никак не реализовано пока, доступна только пауза.

Спасибо, буду думать как по другому сделать)

MerlinUA

  • Зашел в гости
  • *
  • Posts: 7
    • View Profile
Re: Полная остановка потока
« Reply #3 on: December 03, 2015, 11:20:19 AM »
ты же мерлин, взмахни палочкой скажи трах-тибидох и сделается по другому. я вот недумая вижу два способа запускать потоки поставленные на паузу из любого выбранного места потока, но сохраню интригу, чтоб не лишать народ радости творчества и надеюсь что найденные способы будут проще и красивее моих, если конечно подумать нужным местом.  :-X
Я новичок, не так шарю как вы. Если можете - помогите, пожалуйста.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Полная остановка потока
« Reply #4 on: December 03, 2015, 12:11:55 PM »
ты же мерлин, взмахни палочкой скажи трах-тибидох и сделается по другому. я вот недумая вижу два способа запускать потоки поставленные на паузу из любого выбранного места потока, но сохраню интригу, чтоб не лишать народ радости творчества и надеюсь что найденные способы будут проще и красивее моих, если конечно подумать нужным местом.  :-X

Во блин. А я чёт ни одного не вижу ;D Протри мне глаза.
Может я сильно погрузился в питон и в кликере замылился глаз.


MerlinUA

  • Зашел в гости
  • *
  • Posts: 7
    • View Profile
Re: Полная остановка потока
« Reply #5 on: December 03, 2015, 01:38:50 PM »
ты же мерлин, взмахни палочкой скажи трах-тибидох и сделается по другому. я вот недумая вижу два способа запускать потоки поставленные на паузу из любого выбранного места потока, но сохраню интригу, чтоб не лишать народ радости творчества и надеюсь что найденные способы будут проще и красивее моих, если конечно подумать нужным местом.  :-X

Во блин. А я чёт ни одного не вижу ;D Протри мне глаза.
Может я сильно погрузился в питон и в кликере замылился глаз.
Мне кажеться, что тут можно goto использовать, но как - не могу понять.

opalsmoke

  • Зашел в гости
  • *
  • Posts: 5
    • View Profile
Re: Полная остановка потока
« Reply #6 on: December 05, 2015, 06:16:25 PM »
ты же мерлин, взмахни палочкой скажи трах-тибидох и сделается по другому. я вот недумая вижу два способа запускать потоки поставленные на паузу из любого выбранного места потока, но сохраню интригу, чтоб не лишать народ радости творчества и надеюсь что найденные способы будут проще и красивее моих, если конечно подумать нужным местом.  :-X

Во блин. А я чёт ни одного не вижу ;D Протри мне глаза.
Может я сильно погрузился в питон и в кликере замылился глаз.
Мне кажеться, что тут можно goto использовать, но как - не могу понять.
А ты не пробовал IF использовать?
Code: (clickermann) [Select]
THREAD(thr_name,1)
   IF($a=1)
   LOGWRITE("1")
   WAIT(1)
   LOGWRITE("2")
   WAIT(1)
   LOGWRITE("3")
   WAIT(1)
   LOGWRITE("4")
   WAIT(1)
   LOGWRITE("5")
   WAIT(1)
   LOGWRITE("6")
   waitms(10)
END_IF
END_THREAD

MerlinUA

  • Зашел в гости
  • *
  • Posts: 7
    • View Profile
Re: Полная остановка потока
« Reply #7 on: December 05, 2015, 08:48:17 PM »
ты же мерлин, взмахни палочкой скажи трах-тибидох и сделается по другому. я вот недумая вижу два способа запускать потоки поставленные на паузу из любого выбранного места потока, но сохраню интригу, чтоб не лишать народ радости творчества и надеюсь что найденные способы будут проще и красивее моих, если конечно подумать нужным местом.  :-X

Во блин. А я чёт ни одного не вижу ;D Протри мне глаза.
Может я сильно погрузился в питон и в кликере замылился глаз.
Мне кажеться, что тут можно goto использовать, но как - не могу понять.
А ты не пробовал IF использовать?
Code: (clickermann) [Select]
THREAD(thr_name,1)
   IF($a=1)
   LOGWRITE("1")
   WAIT(1)
   LOGWRITE("2")
   WAIT(1)
   LOGWRITE("3")
   WAIT(1)
   LOGWRITE("4")
   WAIT(1)
   LOGWRITE("5")
   WAIT(1)
   LOGWRITE("6")
   waitms(10)
END_IF
END_THREAD
Но если остановить поток, он начнеться с того же места, независимо от значения переменной.

MerlinUA

  • Зашел в гости
  • *
  • Posts: 7
    • View Profile
Re: Полная остановка потока
« Reply #8 on: December 05, 2015, 08:55:04 PM »
ты же мерлин, взмахни палочкой скажи трах-тибидох и сделается по другому. я вот недумая вижу два способа запускать потоки поставленные на паузу из любого выбранного места потока, но сохраню интригу, чтоб не лишать народ радости творчества и надеюсь что найденные способы будут проще и красивее моих, если конечно подумать нужным местом.  :-X

Во блин. А я чёт ни одного не вижу ;D Протри мне глаза.
Может я сильно погрузился в питон и в кликере замылился глаз.
Мне кажеться, что тут можно goto использовать, но как - не могу понять.
А ты не пробовал IF использовать?
Code: (clickermann) [Select]
THREAD(thr_name,1)
   IF($a=1)
   LOGWRITE("1")
   WAIT(1)
   LOGWRITE("2")
   WAIT(1)
   LOGWRITE("3")
   WAIT(1)
   LOGWRITE("4")
   WAIT(1)
   LOGWRITE("5")
   WAIT(1)
   LOGWRITE("6")
   waitms(10)
END_IF
END_THREAD
Code: (clickermann) [Select]
$a=1
THREAD(1,1)
   IF($a=1)
   LOGWRITE("1")
   WAIT(1)
   LOGWRITE("2")
   WAIT(1)
   LOGWRITE("3")
   WAIT(1)
   LOGWRITE("4")
   WAIT(1)
   LOGWRITE("5")
   WAIT(1)
   LOGWRITE("6")
   waitms(10)
END_IF
END_THREAD

WAIT(3)
SETTHREAD (1, 0)
LOGWRITE("Stop")
WAIT(1)
$a=0
SETTHREAD (1, 1)
WAIT(5)
halt

Что получилосЬ:

7:52:42 PM 1
7:52:43 PM 2
7:52:44 PM 3
7:52:45 PM Stop
7:52:46 PM 4
7:52:47 PM 5
7:52:48 PM 6

Может я не так понял?

Atas

  • Активный участник
  • ***
  • Posts: 147
    • View Profile
Re: Полная остановка потока
« Reply #9 on: December 06, 2015, 02:09:56 PM »
Можно попробовать "обскакать проблему на костылях", и конечно же с GOTO ( куда же без него :) ).

Code: (clickermann) [Select]
LOGCLEAR

THREAD(thr_name,1)
   SUB(R)
      IF($R = 1)
         $R = 0
         GOTO(start)
      END_IF
   END_SUB
   
   start:
   
   // Здесь действия, отменяющие последствия прошлого (не законченного) выполнения команд в этом потоке.
   // Например: если была выпонена команда KEYDOWN(#A), то здеь нужно отменить это действие командой KEYUP(#A).
   
   R()
   LOGWRITE("1")
   R()
   WAIT(1)
   R()
   LOGWRITE("2")
   R()
   WAIT(1)
   R()
   LOGWRITE("3")
   R()
   WAIT(1)
   R()
   LOGWRITE("4")
   R()
   WAIT(1)
   R()
   LOGWRITE("5")
   R()
   WAIT(1)
   R()
   LOGWRITE("6")
   R()
   WAIT(5)
   
   GOTO(start)
   
END_THREAD

WAIT(3)
SETTHREAD(thr_name,0)
$R = 1

// Здесь действия, отменяющие последствия прошлого (не законченного) выполнения команд в дочернем потоке "thr_name".
// Например: если была выпонена команда KEYDOWN(#A), то здеь, вероятно,  нужно отменить это действие командой KEYUP(#A).

LOGWRITE("ОСНОВНОЙ ПОТОК")
WAIT(1)
SETTHREAD(thr_name,1)
WAIT(2)
HALT

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Полная остановка потока
« Reply #10 on: December 07, 2015, 10:33:13 AM »
Только не с сабом. Условие с гото после каждой команды.
Это единственное что приходит на ум. Но это же мама родная и пройдёт если поток всего на десяток строк.
Это не наш метод.


MerlinUA

  • Зашел в гости
  • *
  • Posts: 7
    • View Profile
Re: Полная остановка потока
« Reply #11 on: December 07, 2015, 12:28:48 PM »
Только не с сабом. Условие с гото после каждой команды.
Это единственное что приходит на ум. Но это же мама родная и пройдёт если поток всего на десяток строк.
Это не наш метод.
Я вот тоже слепил и это явно не подходит. Сильно тормозит всю программу. Едиственый разумный выход из ситуации, который я нашел, это создать много одинаковых потоков и вызывать все поочереди(благо это нужно делать не очень много раз). Код конечно корявый, но программа работает шустро.

P.S. Всем спасибо за ответы!!

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Полная остановка потока
« Reply #12 on: December 07, 2015, 01:22:34 PM »
к каждой команде ненужно, а вот дописать условие с флагом " невыполнять" можно к каждому циклу и условию или включить в условие крупные блоки команд

Это и так ясно, но зависит от кода. Иногда прийдётся практически к каждой.

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

Это всё костыли. Джонни бы этот вопрос решил очень просто и удобно.