Как теперь Thread саспендить?
От: VVitaliy Россия  
Дата: 13.10.06 07:36
Оценка:
Чтот я торможу сегодня...
Наприсал the_thread.suspend() в C#2 а мне говорят что этот метод типа deprecated и обяснение в мсдн что типа сапендить треды очень, очень опасно, можно мол, деад лок получить, и всё будет очень плохо, и мы типа вас так бережем, что синхронизируйтесь какнить подругому.
А мне нужно именно приостановить выполнение потока на неопределённое время если юзер нажал на паузу.
Что предлагается теперь делать по правилам не говорится. Как здесь быть, ктонить подсткажет?
Re: Как теперь Thread саспендить?
От: desco США http://v2matveev.blogspot.com
Дата: 13.10.06 07:48
Оценка:
Здравствуйте, VVitaliy, Вы писали:

VV>Чтот я торможу сегодня...

VV>Наприсал the_thread.suspend() в C#2 а мне говорят что этот метод типа deprecated и обяснение в мсдн что типа сапендить треды очень, очень опасно, можно мол, деад лок получить, и всё будет очень плохо, и мы типа вас так бережем, что синхронизируйтесь какнить подругому.
VV>А мне нужно именно приостановить выполнение потока на неопределённое время если юзер нажал на паузу.
VV>Что предлагается теперь делать по правилам не говорится. Как здесь быть, ктонить подсткажет?

использовать вещи, предназначенные для синхронизации
see: Monitor, Mutex, ManualResetEvent, AutoResetEvent, Semaphore
Re: Как теперь Thread саспендить?
От: Аноним  
Дата: 13.10.06 07:50
Оценка: -3
Здравствуйте, VVitaliy, Вы писали:

VV>Наприсал the_thread.suspend() в C#2 а мне говорят что этот метод типа deprecated и обяснение в мсдн что типа сапендить треды очень, очень опасно, можно мол, деад лок получить, и всё будет очень плохо, и мы типа вас так бережем, что синхронизируйтесь какнить подругому.

VV>А мне нужно именно приостановить выполнение потока на неопределённое время если юзер нажал на паузу.
VV>Что предлагается теперь делать по правилам не говорится. Как здесь быть, ктонить подсткажет?

Ну, на самом деле это действительно опасно. Однако имеется в виду, что так нельзя делать в managed-коде. Ну а кто или что мешает тебе вызывать API SuspendThread() и ResumeThread() напрямую?
Re[2]: Как теперь Thread саспендить?
От: VVitaliy Россия  
Дата: 13.10.06 08:34
Оценка:
Здравствуйте, desco, Вы писали:

D>Здравствуйте, VVitaliy, Вы писали:


VV>>Чтот я торможу сегодня...

VV>>Наприсал the_thread.suspend() в C#2 а мне говорят что этот метод типа deprecated и обяснение в мсдн что типа сапендить треды очень, очень опасно, можно мол, деад лок получить, и всё будет очень плохо, и мы типа вас так бережем, что синхронизируйтесь какнить подругому.
VV>>А мне нужно именно приостановить выполнение потока на неопределённое время если юзер нажал на паузу.
VV>>Что предлагается теперь делать по правилам не говорится. Как здесь быть, ктонить подсткажет?

D>использовать вещи, предназначенные для синхронизации

D>see: Monitor, Mutex, ManualResetEvent, AutoResetEvent, Semaphore

Собственно в этом и был вопрос, я так понимаю предлагается создать мьютекс, и в потоке типа в цикле вставить вызов его на предмет а не заблокироваться ли. А если цикла никакого и нет просто зову в подзадаче долгую процедуру, что в этом случае предлагается взамен?
Re[2]: Как теперь Thread саспендить?
От: VVitaliy Россия  
Дата: 13.10.06 08:39
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, VVitaliy, Вы писали:


VV>>Наприсал the_thread.suspend() в C#2 а мне говорят что этот метод типа deprecated и обяснение в мсдн что типа сапендить треды очень, очень опасно, можно мол, деад лок получить, и всё будет очень плохо, и мы типа вас так бережем, что синхронизируйтесь какнить подругому.

VV>>А мне нужно именно приостановить выполнение потока на неопределённое время если юзер нажал на паузу.
VV>>Что предлагается теперь делать по правилам не говорится. Как здесь быть, ктонить подсткажет?

А>Ну, на самом деле это действительно опасно. Однако имеется в виду, что так нельзя делать в managed-коде. Ну а кто или что мешает тебе вызывать API SuspendThread() и ResumeThread() напрямую?


Так конечно делать совсем нехорошо ( а может и win32api никакого там и нет, и вообще типа машина не windows (помечтаем...), но всё как это может выглядет?
У нас вроде System.Threading.Thread совсем не тождественен win32 thread?
Re[3]: Как теперь Thread саспендить?
От: Аноним  
Дата: 13.10.06 09:11
Оценка:
Здравствуйте, VVitaliy, Вы писали:

VV>Так конечно делать совсем нехорошо ( а может и win32api никакого там и нет, и вообще типа машина не windows (помечтаем...), но всё как это может выглядет?

VV>У нас вроде System.Threading.Thread совсем не тождественен win32 thread?

Нет, не тождевственен.
Но если мы знаем, что это у нас — Windows, то можно через запоминание хендла GetCurrentThread(), а потом натравливать на этот хендл вышеупомянутые API. Способ черезжопный, но тем не менее, есть один важный момент: если это — твой поток, то 100% надо делать синхронизацией, ну а если нужно суспендить чужой поток? Тут полюбэ придётся перечислять ProcessThread у Process и дальше через API.
Re[3]: Как теперь Thread саспендить?
От: mrozov  
Дата: 13.10.06 09:21
Оценка:
Здравствуйте, VVitaliy, Вы писали:

VV>У нас вроде System.Threading.Thread совсем не тождественен win32 thread?

На самом деле — вроде бы тождественен. Отделение одного от другого — планы на будущее, насколько я помню. Иначе ThreadPool не был бы такой бесполезной штукой

Тебе же вроде все нормальным русским языком объяснили. Suspend-ить опасно именно потому, что suspend прерывает выполнение потока в любом месте, вне зависимости от того, чем он в этот момент занимался.

Т.е. опасен не suspend, а именно то, что ты хочешь сделать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.