Чем pешать бесполезные головоломки...

и задачки для интервью.
Vovka
Уже с Приветом
Posts: 1906
Joined: 14 Mar 2001 10:01

Чем pешать бесполезные головоломки...

Post by Vovka »

напишите за меня программу. [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 );
User avatar
Azazello
Уже с Приветом
Posts: 3179
Joined: 12 Jun 2001 09:01
Location: SPb,Russia->Rehovot, Israel->Cambridge, MA

Чем pешать бесполезные головоломки...

Post by Azazello »

<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>
Vovka
Уже с Приветом
Posts: 1906
Joined: 14 Mar 2001 10:01

Чем pешать бесполезные головоломки...

Post by Vovka »

Azazello, спасибо.
Ваше решение работает с несущественными поправками.
Кроме того, оно подсказало мне, как изменить моё собственное решение так, чтобы оно компилилось на VC6 - у меня были функции-шаблоны, а VC неправильно работает с явным указанием параметров функций шаблонов. Вместо этого, я сделал их статическими ф-циями шаблона класса, теперь всё льётся!

Return to “Головоломки”