Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как расширить свой класс методами класса Thread? 
:(
    Опции темы
alir
Дата 6.12.2005, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 383
Регистрация: 19.3.2005

Репутация: 2
Всего: 4



Как расширить свой класс методами класса Thread?
Пытался наследовать от Thread, но нельзя, так как он является sealed классом.
Может существует интрефейс, содержащий методы Thread, чтоб можно было наследовать от него (как в java - Runnuble)?

Как решить задачу?
PM MAIL ICQ   Вверх
arilou
Дата 6.12.2005, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 21
Всего: 61



Цитата(alir @ 6.12.2005, 19:14)
Как решить задачу?

А что за задача?


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
alir
Дата 6.12.2005, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 383
Регистрация: 19.3.2005

Репутация: 2
Всего: 4



Цитата
А что за задача?

Долго расскзывать. Все свелось к задаче создания класса, который содержит свои методы и переменные, а также методы класса Thread. Дополню сказанное лишь тем, что необходимы два метода класса Thread: suspend и resume.
Как это сделать?
PM MAIL ICQ   Вверх
arilou
Дата 6.12.2005, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 21
Всего: 61



Цитата(alir @ 6.12.2005, 19:33)
Все свелось к задаче создания класса, который содержит свои методы и переменные, а также методы класса Thread

Вот если честно, не могу себе представить такой задачи, потому что класс Thread не просто так сделан sealed.

Если нужно сделать, чтобы у класса был метод, выполняющийся в отдельном потоке, а класс предоставлял возможность приостановить и запустить заново его работу, то это можно сделать так:

Код

public class MyAsyncClass
{
    Thread _thread = null;

    /// <summary>
    /// Приостанавливает выполнение
    /// </summary>
    public void Suspend()
    {
        if(_thread != null && _thread.ThreadState == ThreadState.Running)
        {
            _thread.Suspend();
            // ждем, пока поток остановится
            while(_thread.ThreadState == ThreadState.SuspendRequested); 
        }
    }

    /// <summary>
    /// Продолжает выполнение
    /// </summary>
    public void Resume()
    {
        if(_thread != null && _thread.ThreadState == ThreadState.Suspended)
        {
            _thread.Resume();
            // ждем, пока поток перейдет в состояние Running
            while(_thread.ThreadState != ThreadState.Running); 
        }
    }

    public MyAsyncClass()
    {
        _thread = new Thread(new ThreadStart(startMyOperationImpl));
    }

    /// <summary>
    /// Собственно сама операция
    /// </summary>
    private void startMyOperationImpl()
    {
    }

    /// <summary>
    /// Запускаем асинхронную операцию (public метод-обертка)
    /// </summary>
    public void StartMyOperation()
    {
        _thread.Start();
    }
}


Код не запускал, но все должно работать. При известном желании можно сделать так, что класс будет работать с любым потоковым методом (не только со своим).

Это сообщение отредактировал(а) arilou - 6.12.2005, 19:51


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
alir
Дата 6.12.2005, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 383
Регистрация: 19.3.2005

Репутация: 2
Всего: 4



arilou
Цитата
Вот если честно, не могу себе представить такой задачи, потому что класс Thread не просто так сделан sealed.

А вот про причины я бы почитал.
PM MAIL ICQ   Вверх
arilou
Дата 6.12.2005, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 21
Всего: 61



Цитата(alir @ 6.12.2005, 19:58)
А вот про причины я бы почитал

Класс Thread - это wrapper вокруг API'шных ф-ций по управлению потоками. Нецелесообразно давать возможность изменять его поведение (через наследование), потому что это может привести к непредсказуемым рез-татам.

Задачи, которые нельзя решить с пом.наследования, решаются с помощью аггрегации (как в моем примере).


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
mr.DUDA
Дата 7.12.2005, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(arilou @ 6.12.2005, 19:02)
потому что это может привести к непредсказуемым рез-татам.

если руки не кривые, то и результаты будут предсказуемые, ИМХО


--------------------
user posted image
PM MAIL WWW   Вверх
arilou
Дата 7.12.2005, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 21
Всего: 61



Цитата(mr @ 7.12.2005, 08:56)
если руки не кривые, то и результаты будут предсказуемые, ИМХО

Согласен, но ты же не делаешь допущение, что у всех программистов не кривые руки ;) Вот и они не делают... smile


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
alir
Дата 7.12.2005, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 383
Регистрация: 19.3.2005

Репутация: 2
Всего: 4



Цитата
класс Thread не просто так сделан sealed.

Java вот например разрешает наследовать класс Thread. smile
PM MAIL ICQ   Вверх
arilou
Дата 7.12.2005, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 21
Всего: 61



Цитата(alir @ 7.12.2005, 18:34)
Java вот например разрешает наследовать класс Thread

Ну и что smile Так задачу твою мы решили или нет? Если нет, то будет не лишним тебе постараться и описать ее подробнее, если действительно нужно помощь.


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
mr.DUDA
Дата 7.12.2005, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Есть такой паттерн, называется decorator, aka wrapper:

Цитата
Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality.


Объект класса Thread включается в качестве поля в класс MyThread, который выставляет наружу свои методы - такие же по сигнатуре, как и у Thread (они перенаправляют вызов к Thread-полю класса MyThread), а также дополнительные методы - те, которые необходимы для решения наших собственных задач.


--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0536 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.