напишите за меня программу. [img:bdf2c13031]images/smiles/icon_biggrin.gif[/img:bdf2c13031]
В обчем, объявляется конкурс на написание ф-ции, которая запускает функцию класса как отдельную нить и возвращает её:
template <class Owner>
HANDLE runMember(Owner * obj, void (Owner::*fn)());
Для запуска нити использовать вызов
unsigned long _beginthreadex(0, 0, unsigned ( __stdcall *start_address )( void * ), void *arglist, 0, unsigned *thrdaddr );
Чем pешать бесполезные головоломки...
-
- Уже с Приветом
- Posts: 1906
- Joined: 14 Mar 2001 10:01
-
- Уже с Приветом
- Posts: 3179
- Joined: 12 Jun 2001 09:01
- Location: SPb,Russia->Rehovot, Israel->Cambridge, MA
Чем pешать бесполезные головоломки...
<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">code:</font><hr><pre>
template <class Owner> class Runner
{
public:
struct Params
{
Owner *owner;
void (Owner::*fn());
};
extern "C" static void start_fun(void *arg)
{
Params *params = (Params *)arg;
ASSERT(params);
ASSERT(params->owner);
ASSERT(params->fn);
(params->owner)->(params->fn)();
}
HANDLE runMember(Owner * obj, void (Owner::*fn)())
{
static Params p;
p.owner = obj;
p.fn = fn;
HANDLE thread =
start_thread(Runner::start_fun, &p);
return thread;
}
};
</pre><hr></blockquote>
There should be some serialization added to the runMethod() - critical section or mutex will do - around assignments and start_thread() call...
[ 23-01-2002: Message edited by: Azazello ]</p>
template <class Owner> class Runner
{
public:
struct Params
{
Owner *owner;
void (Owner::*fn());
};
extern "C" static void start_fun(void *arg)
{
Params *params = (Params *)arg;
ASSERT(params);
ASSERT(params->owner);
ASSERT(params->fn);
(params->owner)->(params->fn)();
}
HANDLE runMember(Owner * obj, void (Owner::*fn)())
{
static Params p;
p.owner = obj;
p.fn = fn;
HANDLE thread =
start_thread(Runner::start_fun, &p);
return thread;
}
};
</pre><hr></blockquote>
There should be some serialization added to the runMethod() - critical section or mutex will do - around assignments and start_thread() call...
[ 23-01-2002: Message edited by: Azazello ]</p>
-
- Уже с Приветом
- Posts: 1906
- Joined: 14 Mar 2001 10:01
Чем pешать бесполезные головоломки...
Azazello, спасибо.
Ваше решение работает с несущественными поправками.
Кроме того, оно подсказало мне, как изменить моё собственное решение так, чтобы оно компилилось на VC6 - у меня были функции-шаблоны, а VC неправильно работает с явным указанием параметров функций шаблонов. Вместо этого, я сделал их статическими ф-циями шаблона класса, теперь всё льётся!
Ваше решение работает с несущественными поправками.
Кроме того, оно подсказало мне, как изменить моё собственное решение так, чтобы оно компилилось на VC6 - у меня были функции-шаблоны, а VC неправильно работает с явным указанием параметров функций шаблонов. Вместо этого, я сделал их статическими ф-циями шаблона класса, теперь всё льётся!