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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
arist
0 / 0 / 0
Регистрация: 14.02.2011
Сообщений: 100
04.06.2012, 09:57     Оболочка для потков-методов классов #1
Задача: написать удобную оболочку для реализации многопоточных классов.
Пишу:
ThreadWrap.h:
Код
#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:
Код
#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

Что я сделал неправильно?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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 пишу:
Код
class test{
  THREAD_DECLARE(f)
};
...
VC воспринимает это как функцию int THREAD_DECLARE(f). Причём даже не ругается на то, что в конце нет ;

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

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