Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
arist
0 / 0 / 0
Регистрация: 14.02.2011
Сообщений: 100
#1

Оболочка для потков-методов классов - C++

04.06.2012, 09:57. Просмотров 1248. Ответов 3
Метки нет (Все метки)

Задача: написать удобную оболочку для реализации многопоточных классов.
Пишу:
ThreadWrap.h:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#ifndef _ThreadWrap_h_
#define _ThreadWrap_h_
 
#define THREAD_DECLARE(method) DWORD WINAPI _##method(VOID *); 
                   HANDLE method(VOID *);
 
#define THREAD_BEGIN(theclass, method) 
    HANDLE theclass::method(VOID *pv){ 
        HANDLE h = CreateThread(NULL, 0, _##method, pv, 0, NULL); 
        return h; 
    } 
    DWORD WINAPI theclass::_##method(VOID *pv){
 
#define THREAD_END }
 
#endif _ThreadWrap_h_
main.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "ThreadWrap.h"
 
class test{
public:
    THREAD_DECLARE(f)
};
 
THREAD_BEGIN(test, f)
    return 0;
THREAD_END
 
int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}
Наблюдается две проблемы:
1. В Class View методы f и _f отсутствуют, а присутствует метод THREAD_DECLARE(f):
test
|
-- THREAD_DECLARE(f)

2. На строке THREAD_BEGIN(test, f) выдаётся ошибка:
error C2664: 'CreateThread' : cannot convert parameter 3 from 'DWORD (void *)' to 'LPTHREAD_START_ROUTINE'
None of the functions with this name in scope match the target type

Что я сделал неправильно?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.06.2012, 09:57     Оболочка для потков-методов классов
Посмотрите здесь:

Вызов методов с одинаковыми именами для разных классов - C++
В функцию func можно передать один из двух классов A или B. У них есть функции с одинаковыми именами, но разными входными переменными. Как...

Вызов методов из классов - C++
class B; class A { public: void foo() { B x; //Хотел вызвать метод нижнего класса. (Без наследования). x.foo(); } ...

Связь классов и методов - C++
Помогите понять в чём проблема,в классе TTopic создал метод типа другого класса,а компилятор на это ругается,что не так? #include...

Определение классов и методов - C++
Доброго времени суток! Изучаю язык не долго, самостоятельно и есть проблемка - не могу понять, как определяются методы классов( в VB,...

Написание классов и методов к ним - C++
Уважаемые программисты, подскажите как пишутся классы для игр и методы. Я сейчас пишу игру танчики. Есть класс базовый класс Объект, от...

Вызов методов классов по указателям - C++
Имеется управляющий класс, в котором определен указатель на функцию: void (Operation*) (); Как передавать по данному указателю...

Наследование классов. Конфликт методов - C++
Здравствуйте! Проблема следующая. Написал операции постфиксной и префиксной декрементации и инкрементации счетчика, который находится в...

Реализ иерархии классов и соответствующих им методов! - C++
Привет всем! Срочно нужна помощь в написании программы! Необходимо реализовать иерархию таких классов, как Точка - Единичный вектор -...

Вызов методов базового и производного классов - C++
Народ, объясните тупому механику раннего связывания. Вывод программы, что ниже, 22. Хотя если вызывать непосредственно функцию f, будет...

Хранение экземпляров классов-наследников, и вызов их методов - C++
Столкнулся с проблемой. Есть класс-родитель и 2 класса-наследника. class Base { public: void baseFunc(); }; class...

Шаблоны классов: непонятная ошибка в одном из методов класса - C++
Задача создать шаблон двоичного дерева поиска. В методе удаления узла IntelliSense выдает ошибку: ссылается на if и пишет: "требуется...

Оболочка для программы - C++
Вот пишу программу на с++ и интересует, как создать графическую оболочку для программы? Надо сделать окошко для ввода текста двух...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
04.06.2012, 19:19     Оболочка для потков-методов классов #2
http://msdn.microsoft.com/library/en...eatethread.asp

API-функция CreateThread принимает в качестве 3-го параметра LPTHREAD_START_ROUTINE аргумент. Ты же передаешь... хм... это даже не указатель на функцию...

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

Удачи,
Владимир
arist
0 / 0 / 0
Регистрация: 14.02.2011
Сообщений: 100
05.06.2012, 07:50  [ТС]     Оболочка для потков-методов классов #3
1. Имя функции без скобок и есть указатель на неё. По крайней мере в VC. Но, например, в Turbo C, нужно писать &func_name, хотя давно это было, могу ошибаться.
2. Точно. Так и есть функция должна быть статической.

Спасибо.
arist
0 / 0 / 0
Регистрация: 14.02.2011
Сообщений: 100
05.06.2012, 08:29  [ТС]     Оболочка для потков-методов классов #4
Ещё...
макрос THREAD_DECLARE() определён в заголовке ThreadWrap.h.
ThreadWrap.h включается в main.cpp.
В main.cpp пишу:
C++
1
2
3
4
class test{
  THREAD_DECLARE(f)
};
...
VC воспринимает это как функцию int THREAD_DECLARE(f). Причём даже не ругается на то, что в конце нет ;

Если определение макроса переношу в main.cpp, то всё работает как надо, т.е. THREAD_DECLARE раскрывается в f(...) и _f(...).
Почему? и что делать?
Yandex
Объявления
05.06.2012, 08:29     Оболочка для потков-методов классов
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru