Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.01.2013, 07:47   #1
pufystyj
Форумчанин
 
Аватар для pufystyj
 
Регистрация: 10.11.2010
Сообщений: 569
По умолчанию На этот раз действительно странная проблема

Всем добрый вечер.

У меня появилась странная проблема при компиляции проекта. Дело в том, что я использую библиотеку GLFW для создания потока, но для этого, в качестве аргумента нужно передать функцию, не указатель на неё, а именно функцию. Все бы ничего, но моя функция находиться в классе и при передачи её вот так:
Цитата:
glThread::glThread() : Thread(startFunc) //конструктор класса
{
funcMailCopy = &mailCopy; //даем указатель на функцию mailCopyData(), чтобы позволить работать
//с ней методам базового класса
}
Где функция Thread - конструктор базового (для glThread) класса. Который выглядит так:
Код:
Thread::Thread(GLFWthreadfun func)
{
    threadID = glfwCreateThread(func, NULL); //создаем поток

    mail.changed = false; //задаем стартовые значения
Компилятор пишет ошибку:
Цитата:
error: no matching function for call to 'Thread::Thread(<unresolved overloaded function type>)'|
Когда вытягиваю функцию из класса, все работает...

Использую компилятор minGW. Возможно glfw написана на C и не поддерживает C++? тогда что делать? Есть ли вариант, где не надо выводить эту функцию с класса?
Это ещё не конец и даже не начало конца, это возможно только конец начала.
pufystyj вне форума Ответить с цитированием
Старый 20.01.2013, 08:26   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

сделай функцию статической. Статическая функция класса запускает обычный мембер класса.
_Bers вне форума Ответить с цитированием
Старый 20.01.2013, 08:28   #3
pufystyj
Форумчанин
 
Аватар для pufystyj
 
Регистрация: 10.11.2010
Сообщений: 569
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
сделай функцию статической. Статическая функция класса запускает обычный мембер класса.
то вы имеете ввиде? добавить static? сейчас попробую, я придумал другой способ, но он что-то не работает... Кароче сейчас отпишу.
Это ещё не конец и даже не начало конца, это возможно только конец начала.
pufystyj вне форума Ответить с цитированием
Старый 20.01.2013, 08:34   #4
pufystyj
Форумчанин
 
Аватар для pufystyj
 
Регистрация: 10.11.2010
Сообщений: 569
По умолчанию

ДА, все заработало. Спасибо большое. Огромное спасибо.
Это ещё не конец и даже не начало конца, это возможно только конец начала.
pufystyj вне форума Ответить с цитированием
Старый 20.01.2013, 08:38   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

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

Статический метод класса так же является свободной функцией, поскольку ему не требуется this объекта для запуска.


/зы
Попробуй запустить метод класса через указатель на метод, тогда поймешь, чем запуск через указатель на простую свободную функцию отличается от запуска через указатель на метод.
_Bers вне форума Ответить с цитированием
Старый 20.01.2013, 09:11   #6
pufystyj
Форумчанин
 
Аватар для pufystyj
 
Регистрация: 10.11.2010
Сообщений: 569
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
Я имею ввиду, что обычная свободная функция запускает метод класса, если так сильно хочется перенести бизнес-логику потока внутрь класса.

Статический метод класса так же является свободной функцией, поскольку ему не требуется this объекта для запуска.


/зы
Попробуй запустить метод класса через указатель на метод, тогда поймешь, чем запуск через указатель на простую свободную функцию отличается от запуска через указатель на метод.
Мдя, исправил остальные ошибки выбило
Цитата:
undefined reference to `glThread::startFunc(void*)'
Хехе, вспомнил, раньше статик в клас писал, такое же было... До сих пор не знаю почему не катит...

Цитата:
Попробуй запустить метод класса через указатель на метод, тогда поймешь, чем запуск через указатель на простую свободную функцию отличается от запуска через указатель на метод.
Попробую, но наверное уже завтра, башка не варит вообще, чисто на автомате решил доисправлять ошибки... Надеюсь, когда завтра сяду за код, не прийдеться все переписывать, а то такое уже бывало... )
Это ещё не конец и даже не начало конца, это возможно только конец начала.
pufystyj вне форума Ответить с цитированием
Старый 20.01.2013, 09:13   #7
pufystyj
Форумчанин
 
Аватар для pufystyj
 
Регистрация: 10.11.2010
Сообщений: 569
По умолчанию

Добавил ещё одно сообщение, на всякий случай, если вы уже то прочли... Я перечитал ваше сообщение и понял о чем вы... Простите, голова вообще не варит, пора спать.

Да вы правы, это не плохой вариант... Так и сделаю сейчас...
Это ещё не конец и даже не начало конца, это возможно только конец начала.
pufystyj вне форума Ответить с цитированием
Старый 20.01.2013, 20:59   #8
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

pufystyj, настоятельно рекомендую называть темы адекватно. И пользоваться кнопкой Правка, если хотите что-либо дописать.
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Старый 20.01.2013, 22:26   #9
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Все бы ничего, но моя функция находиться в классе и при передачи её вот так:
есть std::functional - http://www.cplusplus.com/reference/functional/

можешь и просто завернуть в лямбду вызов своего метода (и передавать лямду в thread)

выглядеть это может так примерно (возможны опечатки) :

Код:
class A {
   int a;
public:
   A(): a(0){}
   int f() { return ++a; }
}; // какой-то класс с методом f
Код:
{
   A a; 
   std::thread([&a] { a.f(); }); // в поток передаем лямбду, в которой вызываем метод
} // 1
Я описал с std::thread, с этим вашим GLFW не работал.

То, что ты делаешь - весьма опастно ИМХО, я специально в коде пометил цифрой 1 конец области видимости объекта "а" - при его достижении объект будет уничтожен, и если к этом увремени поток не будет гарантированно завершаться - ты будешь долго искать ошибки.

Последний раз редактировалось rrrFer; 20.01.2013 в 22:50. Причина: заметил опечатку (точки с запятой не хватало)
rrrFer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Странная проблема с Wi Fi gagauz.moldovan Помощь студентам 5 19.10.2012 14:31
Очередная тема "что лучше выбрать". На этот раз планшетные компьютеры. savva-paladin Компьютерное железо 4 15.11.2011 19:47
Опять про PNG, только на этот раз по теме iImageList-а Altera Компоненты Delphi 6 30.06.2009 12:44
Новая зараза ???? СМС вымогатель, но на этот раз не Blackmailer и не Winlock SlepasVS Безопасность, Шифрование 11 13.06.2009 10:38