2 / 2 / 1
Регистрация: 21.08.2009
Сообщений: 134
1

прервать поток

01.11.2009, 09:58. Показов 1605. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
вызываю асинхронно делегат. делегат работает бесконечно по принципу -сделал дело, уснул, проснулся опять сделал. как лучше всего его прервать? сделать переменную, присвоить флаг и проверять ее в делегате? а как разрулить ситуация когда делегат спит?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.11.2009, 09:58
Ответы с готовыми решениями:

Текущий поток должен быть задан как поток однопоточного контейнера (STA), чтобы вызовы OLE стали возможны
пишет:Текущий поток должен быть задан как поток однопоточного контейнера (STA), чтобы вызовы OLE...

Прервать ожидание Thread.Sleep
Можно ли прервать ожидание Thread.Sleep? У меня сейчас в отдельном потоке выполняется некий код,...

Как прервать закрытие формы?
Что прописать в обработчике на закрытие формы, чтобы она не закрылась?

Как прервать выполнение тестового метода при отсутствии соединения с Интернет
В проекте с юнит-тестами (VS 2010) есть метод, который тестирует некую функцию. Но чтобы ее...

3
46 / 46 / 3
Регистрация: 18.10.2009
Сообщений: 119
01.11.2009, 18:49 2
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Worker{
bool m_alive;
ManualResetEvent m_signal;
public Worker(){
m_signal = new ManualResetEvent(false);
(new Thread(DoWork)).Start();
}
private void DoWork(){
while(m_alive){
if(!m_signal.WaitOne(200,false))
continue;
m_signal.Reset();
//TODO do work
}
public void HasWork(){
m_signal.Set();
}
public void OnStop(){
m_alive = false;
}
}
}
C#
1
2
3
var worker = new Worker();
Stopper.Stop+=worker.OnStop;
worker.HasWork();
0
2 / 2 / 1
Регистрация: 21.08.2009
Сообщений: 134
06.11.2009, 09:36  [ТС] 3
а можно подробнее про область
C#
1
2
3
if(!m_signal.WaitOne(200,false))
continue;
m_signal.Reset();
как я понял это слип, но позволяющий прерывать поток?
0
46 / 46 / 3
Регистрация: 18.10.2009
Сообщений: 119
06.11.2009, 12:30 4
WaitHandle - один из стандартных механизмов синхронизации потоков. WaitOne ожидает указанное количество времени (в данном случае в ms) и если дождался возвращает True, иначе False.
ManualResetEvent - это WaitHandle который вручную выставляется (Set,Reset). Когда он Set все потоки вызывающие WaitOne разблокируются (результат True), когда Reset - блокируются при входе в конструкцию WaitOne (результат будет False).
0
06.11.2009, 12:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.11.2009, 12:30
Помогаю со студенческими работами здесь

Если первый процесс за заданное время не выполнился, то прервать его и перейти к выполнению второго
Помогите плиз с реализацией. У меня есть допустим 2 процесса. Каждому процессу назначается время...

как прервать выполнение ASP скрипта?
по типу exit(); в PHP

[WPF] Вызывающий поток не может получить доступ к данному объекту, т.к. владельцем этого объекта является другой поток
Здравствуйте пытаюсь реализовать кросспоточное пополнение listbox в WPF С#, но и в итоге получаю...

Ошибка: вызывающий поток не может получить доступ к данному объекту, так как владельцем этого объекта является другой поток.
Ошибка в "progressBar1.Value += 50;", вызывающий поток не может получить доступ к данному объекту,...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru