przekazanie struktury do ThreadProc(void *Args)

0

Witam,

Zakładajac że chce przekazać stukture do funkcji:
void __cdecl ThreadProc( void *Args )

Jak mam się potem do niej dobrać w tej funkcji ?

calosc wyglada tak
(wycinki kodu)

struct dane{
int a;
int b;}

void __cdecl ThreadProc( void *Args )
{// tu musze się jakoś dobrać do zawartości tej struktury czyli do danych z.a =10 i z.b
}
main(){

struct dane z.
z.a = 10;
z.b = 4;

hThread[0]=( HANDLE ) _beginthread( ThreadProc, 0, (struct dane*)&z );  // nie wiem czy to jest dobrze

}

Proszę o jakieś sugestie.

2
struct dane *d = Args;
printf("%d\n", d->a);
1
hThread[0]=(HANDLE)_beginthread(&ThreadProc,0,&z);  // tak wystarczy
2

Sugestia jest taka, że jeśli przekazujesz wskaźnik do struktury do wątku, nie trzymaj jej w zmiennych lokalnych, bo po prostu, utworzysz wątek, a struktura zostanie nadpisana po wyjściu z tej funkcji (obszar zmiennych lokalnych to po prostu stos i po wyjściu z funkcji będzie na 110% nadpisywany przez inne funkcje), gdzie utworzyłeś wątek (o ile wyszedłeś z niej, a nie czekasz tam na zakończenie wątku).

Najlepiej wykonaj jej kopię w pamięci i dopiero ten wskaźnik przekaż dalej.

0

Dzięki za pomoc i odpowiedzi chociaż tą ostatnią bede jeszcze musiał lepiej zrozumieć.

Mam jeszcze pytanie dlaczego w takiej petli zmien.a zawsze w funkcji ThreadProc ma ostatnią wartość uzyskaną w tej pętli w tym wypadku 90 ?
Próbuje tak zrobić żeby wartość zwiększała się co obrót o 10 i w taki stanie była wysyłana do funkcji bo na co mi 10 wątków liczących to samo.

int w = 0;
	zmien.a = -10;
	zmien.b = 0;
	
	for( w = 0; w < 10; )
	{
	 zmien.a += 10;
	 zmien.b+= 10;
	 hThread[w]=( HANDLE ) _beginthread( ThreadProc, 0, (struct watki*)&zmien);
	 w++;
	 }
WaitForMultipleObjects(w,hThread,TRUE,INFINITE);
0

Przecież ci to wyjaśnił @Bartosz Wójcik.

0
Bartosz Wójcik napisał(a):

Najlepiej wykonaj jej kopię w pamięci i dopiero ten wskaźnik przekaż dalej.

Kopiuje wiec strukturę do identycznej struktury. Ale dalej ten sam błąd. Chyba że źle zrozumiałem cytat. Prosze o jakieś sugestie żebym w koncu zrozumiał.

int w = 0;
    zmien.a = -10;
    zmien.b = 0;
struct dane1 zmien1;
 
    for( w = 0; w < 10; )
    {

     zmien.a += 10;
     zmien.b+= 10;
memcpy(&zmien1.a , &zmien.a, 4);
memcpy(&zmien1.b, &zmien.b,4);
     hThread[w]=( HANDLE ) _beginthread( &ThreadProc, 0, &zmien1);
     w++;
     }
WaitForMultipleObjects(w,hThread,TRUE,INFINITE);
1

Potrzebujesz tablicy tych struktur.

1

Podam przykład żebyś zrozumiał. Masz warsztat (twoja funkcja), przychodzi do niego jakaś praca do zrobienia. Wołasz 10 swoich pracowników i mówisz "ZRÓBCIE MI TE 10 RZECZY JEDNOCZEŚNIE". I dajesz im 1 albo 2 młotki, a ich jest 10-sięciu. Jak myślisz co się stanie? Musisz im dać 10 młotków (czyli w twoim wypadku 10 struktur), żeby nie zabijali się o narzędzia.

0

dziękuje wam za pomoc w końcu zrozumiałem.
Zastanawiam się tylko czy można to napisać jeszcze lepiej. Albo na inny sposób.

         struct watki zmien;
	struct watki1 zmien1[14];
	int w = 0;
	zmien.a = -10 ;
	 zmien.b = 0 ;
	for( w = 0; w < 10; )
	{

	 zmien.a += 10;
	 zmien.b += 10;

	 memcpy(&zmien1[w].a , &zmien.a, 4);
	 memcpy(&zmien1[w].b, &zmien.b,4);
	 hThread[w]=( HANDLE ) _beginthread( &ThreadProc, 0, &zmien1[w]);
	 w++;
	 }
WaitForMultipleObjects(w,hThread,TRUE,INFINITE);
1

Zastanawiam się tylko czy nie można napisać zamiast:

     memcpy(&zmien1[w].a , &zmien.a, 4);
     memcpy(&zmien1[w].b, &zmien.b,4);

po ludzku:

zmien1[w]=zmien;

Oczywiście do tego celu masz mieć tylko jedną strukturę watki lub watki1.

Ale jeszcze lepiej całość:

struct watki zmien[14];
for(int i=0;i<sizeof(zmien)/sizeof(*zmien);++i)
  {
   zmien[i].a=10*(i-1);
   zmien[i].b=10*i;
   hThread[w]=_beginthread(&ThreadProc,0,zmien+i);
  }

1 użytkowników online, w tym zalogowanych: 0, gości: 1