przekazanie struktury do ThreadProc(void *Args)

przekazanie struktury do ThreadProc(void *Args)
KL
  • Rejestracja:około 15 lat
  • Ostatnio:prawie 10 lat
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)

Kopiuj
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.

Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:4 minuty
2
Kopiuj
struct dane *d = Args;
printf("%d\n", d->a);
edytowany 1x, ostatnio: Azarien
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:12 dni
1
Kopiuj
hThread[0]=(HANDLE)_beginthread(&ThreadProc,0,&z);  // tak wystarczy

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
Bartosz Wójcik
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 4 lata
  • Postów:439
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.

KL
  • Rejestracja:około 15 lat
  • Ostatnio:prawie 10 lat
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.

Kopiuj
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);
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:12 dni
0

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


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
KL
aha dzięki to się wyjaśniło, i tez jak juz pisałem muszę sobie to zrozumieć teraz
KL
  • Rejestracja:około 15 lat
  • Ostatnio:prawie 10 lat
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ł.

Kopiuj
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);
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:12 dni
1

Potrzebujesz tablicy tych struktur.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
Bartosz Wójcik
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 4 lata
  • Postów:439
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.

KL
  • Rejestracja:około 15 lat
  • Ostatnio:prawie 10 lat
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.

Kopiuj
         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);
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:12 dni
1

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

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

po ludzku:

Kopiuj
zmien1[w]=zmien;

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

Ale jeszcze lepiej całość:

Kopiuj
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);
  }

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
KL
dzięki musze sobie znowu teraz zrozumieć ten przykład

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.