Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/25: Рейтинг темы: голосов - 25, средняя оценка - 4.92
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330

Прервать ожидание Thread.Sleep

01.10.2015, 12:50. Показов 5090. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Можно ли прервать ожидание Thread.Sleep?
У меня сейчас в отдельном потоке выполняется некий код, при нажатии кнопки стоп меняется переменная bool в true и этот код прекращает выполнятся (наставил везде флаги, если bool в true, то return), при нажатии кнопки старт меняется переменная bool в false и код в потоке начинает выполнятся сначала. Однако, если кнопка стоп была нажата в момент выполнения Thread.Sleep, то пока мы не дождемся его выполнения, кнопку старт нажимать нельзя, так как код просто не увидит что когда-то была нажата кнопка стоп и надо бы сбросить всё к чертям и начать все заново))

В общем вижу путь решения делать приостановку кода не Thread.Sleep, а таймером, но чет не хочется мне с ними замарачиваться, таймеров с десяток делать для каждого потока.. в общем это не выход.

Добавлено через 40 минут
Такое решение вроде норм?
C#
1
2
3
4
5
6
7
              //Thread.Sleep((Convert.ToInt16(textBox1.Text) * 1000)); //ждем пока трубка одумается
               int sleeps = 0;
                while (sleeps < Convert.ToInt16(textBox1.Text) * 1000)
                {
                    Thread.Sleep(10);
                    sleeps += 10;
                }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.10.2015, 12:50
Ответы с готовыми решениями:

Аналог Thread.Sleep
когда вызываешь функцию Вызываю слип в потоке Thread.Sleep(300000) ТО программа начинает криво работать в чем дело ?

Альтернатива записи Thread.Sleep
Всем привет, какая альтернатива для записи System.Threading.Thread.Sleep(1000); Вроде, это не &quot;бестпрактис&quot; ...

GetPixel в связке Thread.Sleep
Здравствуйте. Считываю цвет необходимого мне пикселя из игры. Код считывания собственно стандартный и рабочий: static extern...

12
Эксперт .NET
 Аватар для Rius
13027 / 7592 / 1662
Регистрация: 25.05.2015
Сообщений: 23,098
Записей в блоге: 14
01.10.2015, 13:14
Цитата Сообщение от Nalik Посмотреть сообщение
Такое решение вроде норм?
Костыль.
Я делаю через семафоры/евенты, с ожиданием нескольких источников.
0
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330
01.10.2015, 13:15  [ТС]
А нет, так не подходит, в итоге время ожидания получается больше, чем просто Thread.Sleep. Есть еще предложения?
0
Эксперт .NET
 Аватар для Rius
13027 / 7592 / 1662
Регистрация: 25.05.2015
Сообщений: 23,098
Записей в блоге: 14
01.10.2015, 13:17
Есть. см выше.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
 
namespace ThreadTest
{
    public partial class FormMain : Form
    {
        private Thread mThread;
        private AutoResetEvent mEventResume;
        private AutoResetEvent mEventTerminate;
        private WaitHandle[] mHandles;
 
        public FormMain()
        {
            InitializeComponent();
 
            this.mEventResume = new AutoResetEvent(true);
            this.mEventTerminate = new AutoResetEvent(false);
            this.mHandles = new WaitHandle[] {
                this.mEventTerminate,
                this.mEventResume };
 
            this.mThread = new Thread(new ThreadStart(this.Function));
            this.mThread.Start();
        }
 
        private void StopThread()
        {
            this.mEventTerminate.Set();
            this.mThread.Join();
        }
 
        private void buttonResume_Click(object sender, EventArgs e)
        {
            this.mEventResume.Set();
        }
 
        private void Function()
        {
            while (true)
            {
                // какая-то полезная работа
                System.Media.SystemSounds.Beep.Play();
 
                // засыпаем
                int index = WaitHandle.WaitAny(this.mHandles);
 
                System.Media.SystemSounds.Exclamation.Play();
 
                // смотрим, от чего проснулись
 
                // первое событие - завершение
                if (index == 0)
                    break;
                // второе событие - продолжение
                if (index == 1)
                    continue;
            }
        }
    }
}
Тут ещё вариант как сделать управляемую задержку
1
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330
01.10.2015, 13:17  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
Я делаю через семафоры/евенты, с ожиданием нескольких источников.
а подробнее можно?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
01.10.2015, 13:19
Nalik, для таких дел используйте имеющиеся во фрейморки инструменты для синхронизации, например CancellationTokenSource/CancellationToken.

Пример:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
// Метод, выполняющийся в отдельном потоке
static void DoStuff(object arg)
{
    Console.WriteLine("Work started.");
 
    // Получение жетона из аргумента
    var cancellation = (CancellationToken)arg;
 
    // Дескриптор для ожидания отмены операции
    var cancellationHandle = cancellation.WaitHandle;
 
    // Таймаут на ожидание остановки работы
    var timeout = TimeSpan.FromSeconds(1);
 
    // Выполнять цикл, пока не будет получен сигнал на прекращение работы
    // Если сигнал на прекращение был подан в момент ожидания, то ожидание сразу прекратится
    while (!cancellationHandle.WaitOne(timeout))
        Console.WriteLine("Do stuff");
 
    Console.WriteLine("Work done.");
}
static void Main()
{
    CancellationTokenSource workCancellation;
 
    do
    {
        // Этот объект является одноразовым: один раз отменив, потом надо создавать новый
        workCancellation = new CancellationTokenSource();
 
        // Создание потока
        var thread = new Thread(DoStuff);
 
        // Запуск потока и передача ему жетона на прекращение работы
        thread.Start(workCancellation.Token); 
 
        // Нажатие Enter останавливает поток
        Console.ReadLine();
 
        // Подать сигнал на прекращение работы
        workCancellation.Cancel();
 
        // Подождать поток, пока он не завершит работу
        thread.Join();
 
        Console.WriteLine("Thread done");
        Console.ReadLine();
    }
    while (true);
}
1
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330
01.10.2015, 13:23  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
CancellationTokenSource/CancellationToken.
я использую backgroundworker, честно говоря мне он ужасно не нравится. thread потоки лучше?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
01.10.2015, 13:33
Цитата Сообщение от Nalik Посмотреть сообщение
я использую backgroundworker
Отличная идея

Цитата Сообщение от Nalik Посмотреть сообщение
честно говоря мне он ужасно не нравится
А чем не нравится?

Цитата Сообщение от Nalik Посмотреть сообщение
thread потоки лучше?
У них довольно узкая ниша применения, т.к. они низкоуровневые.
BackgroundWorker для повседневных операций лучше подходит.

Предложенный выше код очень легко переделать под воркера — достаточно вместо имеющегося у него метода CancelAsync использовать CancellationToken
0
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330
07.10.2015, 16:46  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
А чем не нравится?
Ну хотя бы тем, что его нельзя "убить", т.е. для предварительного завершения работы, по всему потоку приходится ставить некие флаги.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
07.10.2015, 17:33
Цитата Сообщение от Nalik Посмотреть сообщение
Ну хотя бы тем, что его нельзя "убить", т.е. для предварительного завершения работы, по всему потоку приходится ставить некие флаги.
Так оно везде так.
Если вы намекаете на Thread.Abort, то это очень опасный инструмент, который нужно использовать точечно и только в самых экстренных случаях.
0
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330
08.10.2015, 08:26  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Если вы намекаете на Thread.Abort
Я никогда не сталкивался с Thread потоками как полномасштабными потоками, но имел ввиду именно про "Thread.Abort" и думал его нормально используют для остановки потока)
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
08.10.2015, 19:15
Цитата Сообщение от Nalik Посмотреть сообщение
имел ввиду именно про "Thread.Abort" и думал его нормально используют для остановки потока)
Как сказано выше, это опасный и нежелательный элемент.
В штатной ситуации поток должен отработать и завершиться как положено. Прерывание потока используется в самых крайних случаях.
0
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330
09.10.2015, 08:18  [ТС]
Цитата Сообщение от insite2012 Посмотреть сообщение
В штатной ситуации поток должен отработать и завершиться как положено.
Очень не удобно, что у потоков нет события которое отлавливает его отмену, без сотни флагов по всему потоку.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.10.2015, 08:18
Помогаю со студенческими работами здесь

Аналог Thread.Sleep или Task.Delay
Есть ли какой-нибудь аналог функциям Thread.Sleep или Task.Delay ? Мне необходимо сделать задержку без блокирования главного потока....

Timer.Elapsed vs Thread.sleep vs Что-то еще? И управление потоками
Доброго времени суток! Прошу помощи уважаемого сообщества. Суть: пишу относительно небольшое приложение для получения информации с...

Есть ли альтернатива Thread.Sleep(); ?
Привет! Создал WinStore приложение (XAML/C#), при нажатии кнопки хочу чтобы в цикле картинка поворачивалась плавно. Какая есть...

Как использовать Thread.Sleep() для нескольких задержек выполнения кода в WPF приложении?
Как использовать Thread.Sleep() для организации нескольких задержек выполнения кода c# в WPF приложении? В WPF приложении с одним...

Как использовать Thread.Sleep(5000), ошибка: "Элемент "Thread" не существует в текущем контексте"
я так понимаю, что Thread.Sleep(5000); это &quot;тормоз&quot; процесса выполенения программы на 5 сек? А как его правильно инициализировать и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru