Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запретить менять спецификатор доступа, для наследника 
V
    Опции темы
andrew_121
Дата 11.3.2010, 03:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



наверное я вас не совсем верно понял.
или вы...

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

Добавлено через 3 минуты и 49 секунд
Код

template <class T>
class ThreadT: public QThread {
 T& m_worker;
 public:
    ThreadT (T& worker) : m_worker(worker) {}
    void start ();
    void terminate ();
  protected:
    void run() {                  <<< это метод предка, который нужно реализовать.
        if (!m_worker ()) terminate();
    }
};
struct Worker 
{
   Worker (int, double, char);
   bool operator () () {}
};
int main ()
{
     Worker worker (1, 2., 'A');
     ThreadT<Worker> thread(worker);
     thread.start();
}

я понимаю это так.
но повторюсь, моc`у это не понравится.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
mes
Дата 11.3.2010, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 144
Всего: 250



Цитата(andrew_121 @  11.3.2010,  02:32 Найти цитируемый пост)
вот я смотрю на ваш код, и абсолютно не въезжаю, как тут использовать QThread 

значит я не до конца понял задание.. Я думал вопрос состоит в иной, чем на данный момент имеется, организации библиотеки smile
т.е пример был ориентирован на избавление от перегрузки Run у QThread.
smile
Можно конечно и без шаблонов, с использованием Функционального объекта с виртуальной функцией,
Код

struct QThreadObj 
{
   virtual ThreadOdj () {}
   virtual bool operator () {}
// или
   virtual void operator () (QThread&) {} 
};

class QThreadFO : QThread {
    ThreadObj& m_obj;
 public:
    QThread (QThreadObj& obj) : m_obj(worker) {}
    void start ();
    void terminate ();
  protected:
    void run() { 
        if (!m_obj ()) terminate();
    }
// или
    void run() { m_obj (*this);  }
};

ну и использовать так :
Код

struct Worker  : QThreadObj
{
   Worker (int, double, char);
   bool operator () () {}
};
int main ()
{
     Worker worker (1, 2., 'A');
     QThreadFO thread(worker);
     thread.start();
}



Это сообщение отредактировал(а) mes - 11.3.2010, 12:33


--------------------
PM MAIL WWW   Вверх
SABROG
Дата 11.3.2010, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

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



Цитата(mes @  11.3.2010,  10:05 Найти цитируемый пост)
Можно конечно и без шаблонов, с использованием Функционального объекта с виртуальной функцией,


А если этот код разделить на 2 части, то какая из них будет принадлежать библиотеке, а какую будет писать сам пользователь класса?

Еще такой вопрос, не будет ли проблемы с функциональным объектом, когда библиотека попытается получить адрес функции для передачи этого адреса в API целевой системы?

Это сообщение отредактировал(а) SABROG - 11.3.2010, 12:18


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 11.3.2010, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 144
Всего: 250



Цитата(SABROG @  11.3.2010,  11:11 Найти цитируемый пост)
А если этот код разделить на 2 части, то какая из них будет принадлежать библиотеке, а какую будет писать сам пользователь класса?

ну так разделено же.. верхний блок кода условно-библиотечный , а нижний условно-пользовательский.


Цитата(SABROG @  11.3.2010,  11:11 Найти цитируемый пост)
Еще такой вопрос, не будет ли проблемы с функциональным объектом, когда библиотека попытается получить адрес функции для передачи этого адреса в API целевой системы?

А зачем ей (АПИ) адрес функции фо (функционального объекта) ? пусть Thread свою функцию и отдает, в которой будет вызывать уже фо smile




--------------------
PM MAIL WWW   Вверх
SABROG
Дата 11.3.2010, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

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



Понял. А как организовать доступ к членам класса QThread из функционального объекта? Делать их friend'ами?


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 11.3.2010, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 144
Всего: 250



Цитата(SABROG @  11.3.2010,  11:37 Найти цитируемый пост)
. А как организовать доступ к членам класса QThread из функционального объекта? 

у thread есть публичный интерфейс (start, terminate, priority.. ) - вот им и нужно пользоваться.. 
Если вопрос как получать thread в котором сейчас работает фо, то смотрите часть кода после // или
Если ж речь о  данных необходимых для работы фо, то они должны быть членами фо, а не thread`a, что и пытался показать конструктором в коде.

Вобщем вопрос непонятен.. если ответил не на то , перефразируйте, плиз
smile




--------------------
PM MAIL WWW   Вверх
SABROG
Дата 11.3.2010, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

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



В принципе у QThread есть несколько protected членов, с которыми необходимо работать. Например exec(), чтобы запускать или не запускать локальный цикл событий.

Как я понял "operator ()" что-то типа безымянного метода? Это мало чем отличается от "obj.someMethod()". В некотором смысле это тоже самое, что и ссылка на метод класса &MyClass::myMethod() и ссылки на экземпляр объекта класса. А если вообще утрировать, то это обычный callback? smile



--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 11.3.2010, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 144
Всего: 250



Цитата(SABROG @  11.3.2010,  12:05 Найти цитируемый пост)
есть несколько protected членов, с которыми необходимо работать. Например exec(), 

ну а  к thread`у она какое отношение имеет ? Qt запихнула все в один класс к ним и обращайтесь smile

Цитата(SABROG @  11.3.2010,  12:05 Найти цитируемый пост)
Как я понял "operator ()" что-то типа безымянного метода? Это мало чем отличается от "obj.someMethod()". 

ага, просто удобно вызывать.. можно любую другую функцию, или даже их набор.
smile

Цитата(SABROG @  11.3.2010,  12:05 Найти цитируемый пост)
. В некотором смысле это тоже самое, что и ссылка на метод класса &MyClass::myMethod() и ссылки на экземпляр объекта класса. 

зачем ерез окно лезть, когда дверь открыта smile это обычный объект который можно использовать синтаксически подобно функции, т.е. obj();


Цитата(SABROG @  11.3.2010,  12:05 Найти цитируемый пост)
А если вообще утрировать, то это обычный callback? smile

Callback это применение. любая функция вызваная полиморфно является по сути колбяком smile




--------------------
PM MAIL WWW   Вверх
SABROG
Дата 11.3.2010, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

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



Цитата(mes @  11.3.2010,  13:35 Найти цитируемый пост)
ну а  к thread`у она какое отношение имеет ? Qt запихнула все в один класс к ним и обращайтесь


Пользовательский объект должен быть на базе QObject'a, чтобы обеспечить межпоточное общение между объектами, да и доступ нужен к сигналам и слотам объекта QThread, чтобы подключение сделать.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 11.3.2010, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 144
Всего: 250



Цитата(SABROG @  11.3.2010,  12:42 Найти цитируемый пост)
Пользовательский объект должен быть на базе QObject'a, чтобы обеспечить межпоточное общение между объектами, да и доступ нужен к сигналам и слотам объекта QThread, чтобы подключение сделать. 

пользовательский объект это фо , вот он на базе QObjecta, если нужно, пусть будет smile


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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