Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Функция - член класса


Автор: Rickert 2.3.2007, 11:58
Есть функция - член класса - как мне её запустить в поток, без привлечения передачи параметров в стат. функцию и без использования глобальных переменных?

Автор: Любитель 2.3.2007, 13:12
Зависит от используемой потоковой либы. Если сие POSIX-функции, то никак. Если, скажем Boost.Thread  smile , то Boost.Bind, скажем.

Автор: Orthenner 2.3.2007, 14:29
для pthreads мне пришлось объявлять функцию-член класса как static. Для С++ лучше юзать boost или тот же QT

Автор: MAKCim 2.3.2007, 16:30
Цитата(Любитель @  2.3.2007,  13:12 Найти цитируемый пост)
Если сие POSIX-функции, то никак

нет ничего невозможного  smile 
Код

class A {
public:
    void F() { std :: cout << "Hello, World!" << std :: endl; }
};

int main() {
    pthread_t thread;
    A a;
    void (A :: *class_ptr)() = &A :: F;
    void* (*ptr)(void*);
    __asm__("movl    %1, %0" : "=r" (ptr) : "0" (class_ptr)); // потому как reinterpret_cast<> бессилен
    pthread_create(&thread, NULL, ptr, &a);
    pthread_join(thread, NULL);
}



Автор: Любитель 4.3.2007, 00:15
MAKCim, уж слишком непортируемый код получаем (да и читабельность всё таки страдает). POSIX поддерживают многие компиляторы (даже в полном объёме). А вот подобные игрушки - единицы  smile 

Автор: MAKCim 4.3.2007, 10:51
Цитата(Любитель @  4.3.2007,  00:15 Найти цитируемый пост)
MAKCim, уж слишком непортируемый код получаем (да и читабельность всё таки страдает). POSIX поддерживают многие компиляторы (даже в полном объёме). А вот подобные игрушки - единицы

с этим никто и не спорит
просто нет ничего невозможного (при желании)

Автор: Любитель 4.3.2007, 12:58
 smile 
Цитата(MAKCim @  4.3.2007,  10:51 Найти цитируемый пост)
просто нет ничего невозможного (при желании)

Ну почему? Скажем, заставить господина MAKCim писать на шарпе (по крайней мере официал релиз, так сказать) smile

Автор: MAKCim 4.3.2007, 13:14
Цитата(Любитель @  4.3.2007,  12:58 Найти цитируемый пост)
Ну почему? Скажем, заставить господина MAKCim писать на шарпе (по крайней мере официал релиз, так сказать) 

это вполне возможно  smile 
я ничего, кстати, против .NET и C#-а в частности не имею. Думаю для решения многих не критичных к скорости прикладных задач в Window$ это самый лучший выбор
так что если придется их писАть (вот тут уж не дай бог  smile (но не из-за C#)), мой выбор будет С#  smile 

Автор: Любитель 4.3.2007, 13:50
Я взял шарп именно потому, что его главная область:
Цитата(MAKCim @  4.3.2007,  13:14 Найти цитируемый пост)
не критичные к скорости прикладные задачи в Window$


Учитывая
Цитата(MAKCim @  4.3.2007,  13:14 Найти цитируемый пост)
вот тут уж не дай бог

делаем выводы...

То есть виновать не шарп как таковой, а его главная область применения. Именно поэтому я подчеркнул, что речь про официал релиз. Всякие Моно (а также до сих пор непонимаемые мною дотгну) в рассмотрение не входят. smile

Автор: Rickert 7.3.2007, 12:54
Что значит POSIX-функция?

Автор: MAKCim 7.3.2007, 20:29
Цитата(Rickert @  7.3.2007,  12:54 Найти цитируемый пост)
Что значит POSIX-функция? 

которая находится в библиотеке pthread

Автор: Ken 31.3.2007, 23:58
Цитата(Rickert @ 2.3.2007,  11:58)
Есть функция - член класса - как мне её запустить в поток, без привлечения передачи параметров в стат. функцию и без использования глобальных переменных?

Решается легко, примерно таким образом:
Создаешь простой базовый Thread класс.
//--------------------------------------
class Thread
{
    public:
        void start ();

    protected:
        virtual void run () = 0;

    private:
        pthread_t _thread;

        static void* doExecute (void* threadObject);
};
//--------------------------------------
void Thread::void start ()
{
    pthread_create (&_thread, NULL, doExecute, this);
    pthread_detach (pthread_self ());
}

static void* Thread::doExecute (void* threadObject)
{
   Thread* thread = (Thread*) threadObject;
    thread->run ();
    return NULL;
}
//--------------------------------------
Делаешь Thread родителем своего класса который содержит нужный тебе метод
и реализуешь метод run ().

class MyThreadedClass: public Thread
{
    protected:
        void run ()
        {
            // тут вызываешь свой метод
        }
}
//--------------------------------------
Создаешь объект и запускаешь поток:

MyThreadedClass* thead = new MyThreadedClass ();
...
thread->start ();

Автор: MAKCim 1.4.2007, 08:51
Ken
имхо, имелось в виду не это

Автор: Ken 1.4.2007, 10:38
Цитата(MAKCim @ 1.4.2007,  08:51)
Ken
имхо, имелось в виду не это

Возможно, но используя класс Thread он уже не будеть думать о статической функции и глобальных переменных для этой задачи, все уже скрыто внутри Thread.

А вообще, без использовании статической или глобальной функции невозможно, ибо posixthreads требует этого.

Автор: MAKCim 1.4.2007, 11:40
Цитата(Ken @  1.4.2007,  10:38 Найти цитируемый пост)
А вообще, без использовании статической или глобальной функции невозможно, ибо posixthreads требует этого. 

все возможно  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)