Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows > .NET
Перезагрузить страницу Thread.Join как убить процесс
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Drey^the^first Drey^the^first вне форума
Member
 
Сообщений: 59
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 20.08.2004
По умолчанию Thread.Join как убить процесс - 23.11.2006, 17:16

Имеется поток, реализующий некоторую функцию. Далее:

Код:
Thread t;
...
t.Start();
...
// взвожу флаг, проверяемый функцией потока
this.stopFlag = true;

// если приостановлен
// вообще, можно и закомментировать условие оставив
// следующую строку
if ((t.ThreadState & ThreadState.Suspended) != 0)
  t.Resume();
t.Join();
- зависание. поток НЕ завершается. Но как его таки грохнуть?
Abort() на приостановленном потоке тоже не работает.
Ответить с цитированием
  (#2 (permalink)) Старый
ZhekaS ZhekaS вне форума
Member
 
Сообщений: 53
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 22.09.2006
По умолчанию 24.11.2006, 00:56

А почему он должен завершаться ? Join всего лишь блокирует вызвавший поток (т.е. приведенный в примере), до тех пор, пока поток t не завершится. Если он не завершается "естественным" (или другим) путем, то зависание вам гарантированно
Ответить с цитированием
  (#3 (permalink)) Старый
Drey^the^first Drey^the^first вне форума
Member
 
Сообщений: 59
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 20.08.2004
По умолчанию 24.11.2006, 10:46

Должен, т.к. взвожу флаг, который проверяет поток и выходит из цикла

Код:
void ThreadStartRoutine()
{
  while(MainFormSendByaReferenceInConstructor.stopFlag == false)
  {
   ...
  }
}
Если поток не был Suspended - все ОК. Т.е. проблема только с Suspended потоками - ну не хотят оне завершаться. Как вообще их завершают?
Ответить с цитированием
  (#4 (permalink)) Старый
ZhekaS ZhekaS вне форума
Member
 
Сообщений: 53
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 22.09.2006
По умолчанию 24.11.2006, 13:08

Вот что пишет МСДН по этому поводу:

Цитата:
Caution
Do not use the Suspend and Resume methods to synchronize the activities of threads. You have no way of knowing what code a thread is executing when you suspend it. If you suspend a thread while it holds locks during a security permission evaluation, other threads in the AppDomain might be blocked. If you suspend a thread while it is executing a class constructor, other threads in the AppDomain that attempt to use that class are blocked. Deadlocks can occur very easily.
Я бы прислушался Используйте сигналы, мьютексы, семафоры, мониторы для синхронизации.
Ответить с цитированием
  (#5 (permalink)) Старый
Drey^the^first Drey^the^first вне форума
Member
 
Сообщений: 59
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 20.08.2004
По умолчанию 24.11.2006, 14:00

Т.е. вообще не приостанавливать поток? Вроде тоже плохо. Зачем мне десяток лишних функционирующих потоков, когда я могу их "усыпить"?

У меня заработало после:
- установка флага завершения
- разбудить поток, если заснул (if(...) Resume)
- усыпить главный поток (200 ms) (Thread.Sleep)
- дождаться разбуженного потока (th.Join)

А вообще - эта тема меня уже убивает.
Ответить с цитированием
Ads.
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с LEFT JOIN Leon MySQL 2 23.04.2012 21:04
Thread stopped что это значит l'Question WinAPI 0 14.12.2009 00:44
Убить процесс, последствия работы с OLE 095 Delphi 4 13.02.2008 09:34
Как проанализировать код на thread-safe Гуменюк Роман Delphi 5 20.07.2007 17:08
MySql сложный запрос с JOIN с сортировкой по предмету SELECT amixen MySQL 1 16.11.2006 16:51
Как работать с Thread BaRaDeD C++ Builder 3 13.04.2006 23:50
Создание два thread вместе Rider C++ Builder 2 01.02.2006 00:38
Реализация модуля thread o_nick Oberon 12 22.02.2005 06:59
Где найти книгу по Thread DarkShade C++ Builder 9 25.11.2004 18:43
Как загрузить Socket в Thread kamyu Delphi 1 31.03.2004 10:14
Как программно убить процесс Anonymous WinAPI 1 06.11.2003 22:53
Убить процесс по событию OnTimer Anonymous Delphi 1 25.08.2003 08:10



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов