Чтот я торможу сегодня...
Наприсал the_thread.suspend() в C#2 а мне говорят что этот метод типа deprecated и обяснение в мсдн что типа сапендить треды очень, очень опасно, можно мол, деад лок получить, и всё будет очень плохо, и мы типа вас так бережем, что синхронизируйтесь какнить подругому.
А мне нужно именно приостановить выполнение потока на неопределённое время если юзер нажал на паузу.
Что предлагается теперь делать по правилам не говорится. Как здесь быть, ктонить подсткажет?
Здравствуйте, VVitaliy, Вы писали:
VV>Чтот я торможу сегодня... VV>Наприсал the_thread.suspend() в C#2 а мне говорят что этот метод типа deprecated и обяснение в мсдн что типа сапендить треды очень, очень опасно, можно мол, деад лок получить, и всё будет очень плохо, и мы типа вас так бережем, что синхронизируйтесь какнить подругому. VV>А мне нужно именно приостановить выполнение потока на неопределённое время если юзер нажал на паузу. VV>Что предлагается теперь делать по правилам не говорится. Как здесь быть, ктонить подсткажет?
Здравствуйте, VVitaliy, Вы писали:
VV>Наприсал the_thread.suspend() в C#2 а мне говорят что этот метод типа deprecated и обяснение в мсдн что типа сапендить треды очень, очень опасно, можно мол, деад лок получить, и всё будет очень плохо, и мы типа вас так бережем, что синхронизируйтесь какнить подругому. VV>А мне нужно именно приостановить выполнение потока на неопределённое время если юзер нажал на паузу. VV>Что предлагается теперь делать по правилам не говорится. Как здесь быть, ктонить подсткажет?
Ну, на самом деле это действительно опасно. Однако имеется в виду, что так нельзя делать в managed-коде. Ну а кто или что мешает тебе вызывать API SuspendThread() и ResumeThread() напрямую?
Здравствуйте, desco, Вы писали:
D>Здравствуйте, VVitaliy, Вы писали:
VV>>Чтот я торможу сегодня... VV>>Наприсал the_thread.suspend() в C#2 а мне говорят что этот метод типа deprecated и обяснение в мсдн что типа сапендить треды очень, очень опасно, можно мол, деад лок получить, и всё будет очень плохо, и мы типа вас так бережем, что синхронизируйтесь какнить подругому. VV>>А мне нужно именно приостановить выполнение потока на неопределённое время если юзер нажал на паузу. VV>>Что предлагается теперь делать по правилам не говорится. Как здесь быть, ктонить подсткажет?
D>использовать вещи, предназначенные для синхронизации D>see: Monitor, Mutex, ManualResetEvent, AutoResetEvent, Semaphore
Собственно в этом и был вопрос, я так понимаю предлагается создать мьютекс, и в потоке типа в цикле вставить вызов его на предмет а не заблокироваться ли. А если цикла никакого и нет просто зову в подзадаче долгую процедуру, что в этом случае предлагается взамен?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, 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.
Здравствуйте, VVitaliy, Вы писали:
VV>У нас вроде System.Threading.Thread совсем не тождественен win32 thread?
На самом деле — вроде бы тождественен. Отделение одного от другого — планы на будущее, насколько я помню. Иначе ThreadPool не был бы такой бесполезной штукой
Тебе же вроде все нормальным русским языком объяснили. Suspend-ить опасно именно потому, что suspend прерывает выполнение потока в любом месте, вне зависимости от того, чем он в этот момент занимался.
Т.е. опасен не suspend, а именно то, что ты хочешь сделать.