LINUX.ORG.RU

Аналог QThread.


0

0

День добрый!

Нужно сделать аналог класса QThread, не использующий Qt. В общем, ничего сложного, но столкнулся с одной маленькой проблемой.
Имеем следующий код (пишу по памяти):

class TThread {
private:
static void *Start(void *Object);
protected:
virtual void Run() = 0;
publlic:
void TThread();
};

Метод Start объявляется в конструкторе как start_routine для создаваемого потока. Вид метода:

void * TThread::Start(void *Object)
{
((TThread *) Object)->Run();
return NULL;
}

Для проверки я сделал класс TMyThread, в котором определил метод Run(). Внимание вопрос: почему при выполнении программы на экран выводиться что-то вроде "Avoid to call pure virtual method" и происходит аварийное завершение работы. В чем я не прав?



Может,

static void *Start(void *Object);

объявить как:

static void start( TThread*);

?



ANDI ★★
()

Я сталкивался с подобным и списал это на реализацию классов в GCC
(в Borland такое работало ;), т.е.
при создании экземпляра класса когда работает конструктор базового (в твоем случае TThread) в таблице виртуальных методов еще нет указателя на метод Run...
Выход:
1. (кривоватый). Поставь задержку
void * TThread::Start(void *Object)
{
usleep(100);
((TThread *) Object)->Run();
return NULL;
}

2. Создай метод типа Resume() которым запустишь трид вне конструктора.

OlegY
()
Ответ на: комментарий от syomin

Дорогой syomin, вы чего это? Задумали свою реализацию QThread делать, а не знаете что virtual void Run() = 0; - это чисто виртуальный метод (у него нет реализации) и вызывать напрямую его нельзя. Его надо переопределить в потомке. Мой совет, не начинайте делать таких сложных классов, пока не будете знать язык на пять. Когда мне нужны потоки (а они мне нужны постоянно :-)) я пользуюсь библиотекой ACE_Wrappers http://www.cs.wustl.edu/~schmidt/ACE.html (очень и очень советую). И не пытаюсь изобрести велосипед. С уважением. Желаю успехов.

ASm
()
Ответ на: комментарий от ASm

Дорогой ASm, вы чего это? Я вроде достаточно ясно написал, что виртуальную функцию-член я переопределил в потомке. Читать нужно внимательнее. Проблема действительно в том, что нельзя вызывать виртуальую функцию-член из конструктора.

За библиотеку спасибо, но она не подходит. Лучше "изобрести свой велосипед", чем ради одно-двух класов тащить чужую (и не очень-то распространенную) библиотеку.

syomin
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.