Показать сообщение отдельно

  #27  
Старый 24.06.2007, 14:29
ZaCo
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;
}