Author Topic: Как проверить что поток остановился?  (Read 2946 times)

0 Members and 1 Guest are viewing this topic.

АНТИКЛАН

  • Активный участник
  • ***
  • Posts: 111
    • View Profile
Задался пару дней назад вопросом. Как проверить что поток поставленный на паузу уже остановился и можно продолжать работу. В документации об этом ничего нет. Просто бывают ситуации когда команда на остановку потока уже отработала, а действия из останавливаемого потока как бы довыполняются. Можно конечно решить задержками, но тормозить ими скрипт как то не правильно. Если штатных средств нет то видимо придется свою систему сигналов разрабатывать наверное. Кто что думает? :)
« Last Edit: January 05, 2017, 10:50:20 PM by АНТИКЛАН »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Как проверить что поток остановился?
« Reply #1 on: January 06, 2017, 02:49:24 PM »
Что значит продолжает выполняться? Примеры бы.
В 4.12 выполнялась только пауза. Какой она может вред принести?. Если большая, разбить на цикл маленьких и проблемы нет.
В 4.13 и паузу пофиксили. Может можно на бету пока перейти или подождать.


АНТИКЛАН

  • Активный участник
  • ***
  • Posts: 111
    • View Profile
Re: Как проверить что поток остановился?
« Reply #2 on: January 06, 2017, 08:48:05 PM »
Что значит продолжает выполняться? Примеры бы.
В 4.12 выполнялась только пауза. Какой она может вред принести?. Если большая, разбить на цикл маленьких и проблемы нет.
В 4.13 и паузу пофиксили. Может можно на бету пока перейти или подождать.

Как пример(код не привожу так как вне среды назначения он работать все равно не будет):
В первом потоке постоянно нажимается клавиша с интервалом в секунду или две, а во втором по нажатию условной клавиши идет вставка текста в текстовое поле с предварительной остановкой первого потока через SETTHREAD(POTOK1, 0). Так вот примерно в половине случаев в поле попадает и нажатие клавиши из первого потока. Схематично это выглядит так:

    Поток1
        Нажатие клавиши
        Пауза 1 сек
    Конец_Потока1

    Поток2
        Начало_Условия(Если нажата клавиша)
            Остановить Поток1
            Активировать текстовое поле
            Вставить текст в текстовое поле
            Отправить текст
            Запустить Поток 1
        Конец_Условия
    Конец_Потока2
« Last Edit: April 15, 2018, 06:55:31 PM by АНТИКЛАН »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Как проверить что поток остановился?
« Reply #3 on: January 07, 2017, 09:10:51 AM »
хорошо бы вставить небольшую задержку после остановки.

Остановить Поток1
WAITMS(50)

АНТИКЛАН

  • Активный участник
  • ***
  • Posts: 111
    • View Profile
Re: Как проверить что поток остановился?
« Reply #4 on: January 07, 2017, 02:43:50 PM »
хорошо бы вставить небольшую задержку после остановки.

Остановить Поток1
WAITMS(50)

Это то понятно что так можно сделать. Вопрос в том как обойтись без таких разрывов. Сами понимаете что ручное управление хронометражем это всегда гемор в будущем.
« Last Edit: April 15, 2018, 06:55:42 PM by АНТИКЛАН »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Как проверить что поток остановился?
« Reply #5 on: January 08, 2017, 09:55:35 PM »
Для задач, где применяется кликер, в силу специфики, 50 мс это ничего. В большинстве тормозим сознательно гораздо больше.
Да и не только кликер. Во многих средах где используются аналоги потоков и процессов, они требуют расходов. Расходов времени на синхронизацию и управление. Во многих реальных задачах нельзя получить аналог параллельной работы на 100%, как раз из за сложности распределения задач и потерях на совместных блокировках.