przekazanie struktury do ThreadProc(void *Args)

Odpowiedz Nowy wątek
2014-12-16 20:11
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.

Pozostało 580 znaków

2014-12-17 13:28
2
struct dane *d = Args;
printf("%d\n", d->a);
edytowany 1x, ostatnio: Azarien, 2014-12-17 13:30

Pozostało 580 znaków

2014-12-17 13:31
1
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.

Pozostało 580 znaków

2014-12-17 14:34
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.


Pozostało 580 znaków

2014-12-17 15:36
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);

Pozostało 580 znaków

2014-12-17 15:40
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.
aha dzięki to się wyjaśniło, i tez jak juz pisałem muszę sobie to zrozumieć teraz - klops 2014-12-17 15:43

Pozostało 580 znaków

2014-12-18 18:38
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);

Pozostało 580 znaków

2014-12-18 20:56

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.

Pozostało 580 znaków

2014-12-19 21:41
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.


Pozostało 580 znaków

2014-12-20 16:31
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);

Pozostało 580 znaków

2014-12-20 17:02
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);
  }

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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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