Переменные экземпляра Pthread, выполняющие методы из класса - PullRequest
2 голосов
/ 20 июня 2011

Я пытаюсь спроектировать активный объект такого рода, который когда-то был создан, по сути, работает в своем собственном потоке.Пока что я создал класс, который содержит переменную экземпляра pthread, а затем в конструкторе для этого класса он должен отправить pthread на своем пути.

Поскольку pthread_create () принимает параметры функции,Я передаю ей функцию run (), которую я установил в своем файле реализации класса.

На данный момент моя функция run () не является частью класса, она просто находится в файле реализации, нокогда я пытался скомпилировать его, я получаю сообщение об ошибке:

"error: ‘run’ was not declared in this scope"

Теперь я понимаю, почему функция run () выходит из области видимости, но было бы правильно просто добавить run () в мой активныйкласс объекта как частная функция, или это вызовет другие проблемы, если существует более одного из этих объектов?Черт, это вызовет проблемы только с одним из них?

Хорошо, вот код, я просто не думал, что он имеет большое значение.Вот MyClass.hpp

class MyClass {

private:
pthread_t thread;

    ObjectManager *queue;
int error;

    // just added this, but the compiler still doesn't like it
    void *run(void *arg);

public:

    MyClass();
    ~MyClass();

void start();
}

А вот реализация, MyClass.cpp:

#include "MyClass.hpp"

void MyClass::start() {
if (queue == NULL)
    return;

int status = pthread_create(&thread, NULL, run, (void *) queue);
if (status != 0) {
    error = status;
    return;
}

}


void *MyClass::run(void *arg) {
bool finished = false;
while (!finished) {
        // blah blah blah
}
return NULL;
}

1 Ответ

2 голосов
/ 20 июня 2011

Ваша проблема с компиляцией, вероятно, что run определено в вашем файле реализации после того, как вы ссылаетесь на него в своем конструкторе.Либо переместите определение run перед конструктором, либо вставьте объявление run перед конструктором.

Что касается вашей проблемы, сделав его членом класса, который не будет работать, поскольку pthread_create ищетфункция, не являющаяся членом.Вы могли бы сделать это статическим методом в классе, но прочитав В C ++, безопасно / переносимо ли использовать статический указатель на функцию-член для обратных вызовов C API? , прежде чем решать, безопасно ли вам это делать (нечто вам нужно теперь, когда вы знаете, как использовать исходную функцию).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...