Запаузить поток Delphi

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by imreadyourmind, 23 Apr 2010.

  1. imreadyourmind

    imreadyourmind New Member

    Joined:
    23 Feb 2010
    Messages:
    39
    Likes Received:
    4
    Reputations:
    5
    Кто-как делаетт паузы в потоке?
    Слиип и вейтфоробджект вешают программу(
    Если использовать суспенд прямо в потоке, то возобновлять поток можно только вне потока.

    К примеру если мне нужно запаузить поток на 20 секунд.
    Я делал суперизвратно, вот таким способом.

    Паузил поток суспендом и запускал вне потока таймер, по истечению которого поток опять запускался. Таким способом появляется максимум траблов и глюков.

    Есть какие-нибудь адекватные способы запаузить поток на определенное кол-во времени, не вещая программу?
     
  2. gisTy

    gisTy Elder - Старейшина

    Joined:
    24 May 2008
    Messages:
    432
    Likes Received:
    160
    Reputations:
    27
    пускать sleep если установлен флаг?
     
    1 person likes this.
  3. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    Самый безглючный вариант - создать глобальную переменную булева типа, а в потоке регулярно проверять её состояние:
    while Pause do sleep(1);
     
  4. imreadyourmind

    imreadyourmind New Member

    Joined:
    23 Feb 2010
    Messages:
    39
    Likes Received:
    4
    Reputations:
    5
    слип вешает программу!
    Это понятно, но слип вешает программу))
    А мне нужно чтобы к примеру 1 из 100 потоков остановился а остальные 99 продолжали работать. А слип повесит всю 100 потоков.
     
  5. gisTy

    gisTy Elder - Старейшина

    Joined:
    24 May 2008
    Messages:
    432
    Likes Received:
    160
    Reputations:
    27
    а ты не пробовал слип в потоке запускать?
     
  6. imreadyourmind

    imreadyourmind New Member

    Joined:
    23 Feb 2010
    Messages:
    39
    Likes Received:
    4
    Reputations:
    5
    Ты сам то пробовал?)))))))) Вешет слип всю программу.Вместе со всеми потоками, пробовал не раз.
     
  7. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    +1. ТС в потоке слип не повесит программу, проверено
    А чтобы можно было только один поток запаузить добавляй в класс потока свойство Pause, тогда у каждого потока свой флаг паузы

    бред, ты что-то неправильно делаешь. Я гарантирую это!!11

    Sleep - апишная функция, для текущего потока
     
    #7 GhostOnline, 23 Apr 2010
    Last edited: 23 Apr 2010
  8. imreadyourmind

    imreadyourmind New Member

    Joined:
    23 Feb 2010
    Messages:
    39
    Likes Received:
    4
    Reputations:
    5
    Щас скину исходник и ехе)))))))
     
  9. imreadyourmind

    imreadyourmind New Member

    Joined:
    23 Feb 2010
    Messages:
    39
    Likes Received:
    4
    Reputations:
    5
    Все разобрался. если слип использовать в функции которая используется в синхронайз, то вешается все полностью. Если использовать слип в execute то вешается только один поток))))) Все верно)Сенкс)
     
  10. Meecript_

    Meecript_ Banned

    Joined:
    29 Oct 2008
    Messages:
    194
    Likes Received:
    62
    Reputations:
    32
    Синхронайзы - зло, слишком не увлекайся ими ;)
     
  11. imreadyourmind

    imreadyourmind New Member

    Joined:
    23 Feb 2010
    Messages:
    39
    Likes Received:
    4
    Reputations:
    5
    Без синхронизации будет хуже))
     
  12. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    Ага, это точно.
    Ставил эксперимент: 100 потоков двигают прогрессбар двумя разными способами: синхронайзом и оконными сообщениями. так в первом случае прогресс до 1000000 двигался 32 секунды, нагрузка на проц 50-60%(!), а во втором случае двигался 20 сек, а нагрузка стремилась к нулю!