
24.06.2007, 14:29
|
|
Banned
Регистрация: 20.06.2005
Сообщений: 880
Провел на форуме: 4610226
Репутация:
1332
|
|
Будь-то программирование на winapi, будь-то программирование на posix при создании многопоточного приложения одинаково часто возникает неудобство выраженное в виде невозможности стандартным образом передать своей функции через CreateThread/pthread_create более одного аргумента. Пример двух используемых функций по вин thread.c:
Код:
/*
thread.c by ZaCo
*/
#include <windows.h>
//вспомогательная функция-поток из которой вызываем запрашиваемую функцию
void * Thread(int * temp)
{
void * func=(void *)(*temp);//вызываемая функция
temp++; //переходим к следующему адресу
int num=*(int *)temp; //кол-во аргументов
int i;
temp+=num; //сдвигаемся просто до конца тк аргументы нужно передавать задом-наперед ;)
for(i=num-1;i>=0;i--,temp--)
{
int * param=*(int **)temp;//каждый раз получаем нужный адрес
_asm push param;
}
delete [2+num] (temp-1); //освобождаем память выделенную в NewThread
_asm call func; //вызываем функцию
return NULL;
}
//функция создания потока: func - функция, num - кол-во аргументов-указателей после num
void * NewThread(void * func, unsigned int num, ...)
{
int * temp=new int[2+num]; //temp - массив адресов которые в итоге нужно передать функции-потоку
memcpy(temp,&func,(2+num)*sizeof(void*));
CloseHandle(CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread,temp,0,NULL));
}
//
Работа в основной программе:
Код:
#include <stdio.h>
void * NewThread(void *, unsigned int, ...);
void * Thread(int *);
#include "thread.c"
void * func(int * a,char * b,int * c, char * s)
{
printf("%d+%d+%d+%s\n",*a,*b,*c,s);
return NULL;
}
int main(int argc, char* argv[])
{
int a=5,b=7,g=4;
char s[]="it's xek!";
NewThread(func,4,&a,&b,&g,&s[0]);
Sleep(1000);
return 0;
}
|
|
|