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

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

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

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

04.06.2012, 09:57. Просмотров 1222. Ответов 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++
Наследование классов. Конфликт методов C++
C++ Связь классов и методов
C++ Шаблоны классов: непонятная ошибка в одном из методов класса
Вызов методов с одинаковыми именами для разных классов C++
Хранение экземпляров классов-наследников, и вызов их методов C++
C++ Оболочка для программы
Вызов методов классов по указателям C++
C++ Реализ иерархии классов и соответствующих им методов!
C++ Вызов методов базового и производного классов
C++ Вызов методов из классов
Написание классов и методов к ним 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     Оболочка для потков-методов классов
Ответ Создать тему
Опции темы

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