[Pomoc] Ispreplitanje funkcija?

Započeo [ED] ZicMortal, Avgust 03, 2011, 18:32:10 POSLE PODNE

prethodna tema - sledeća tema

0 članova i 1 gost pregledaju ovu temu.

Ispreplitanje funkcija je nešto šta mi nije jasno kod sampa i pawnoa.


Uvjerio sam se mnogo puta u to ali nisam još uvijek siguran do čega je to tako i dali je 100 % tako.
SA:MP klijent te povezanost sa svim igračima, izraÄ'eno je u C++ ako se nevaram. I Svakog trenutka, kada se neka funkcija izvrÅ¡i, treba joj vrijeme u kojem se izvrÅ¡i i treba se dobiti dani efekt za kojega se koristi funkcija.


Primjer:
Recimo imamo string, kao global varijablu u skripti. Preoblikovanje tog stringa izvrÅ¡ava se sa format (može i sa strmid al nije to sad važno).. i sada, ako imamo jedan string u nekoj komandi /fiil recimo, da napuniÅ¡ gorivo u autu... i zatim, kada se napuni piÅ¡e ti 'potroÅ¡io si TOLIKO_I_TOLIKO novaca za TOLIKO_I_TOLIKO napunjenog goriva'. I sve u redu, a meÄ'utim.

Å to se dogodi, ako se izmeÄ'u tog 'format(string,..);' i 'SendClientMessage(...,...,string);' dogodi to da se upravo taj string pretvori u neÅ¡to drugo, recimo ako isti taj string koristimo u IC chatu 'Ime_Prezime govori: ej kak si'...

I sada, poanta je u tome, dali se u tom razmaku (razmaku dviju funkcijama), u milisekundama izvršavanja, uspije string pretvoriti u nešto drugo ako ga negdje drugdje koristimo
Dali se uspije izmeÄ'u 'format(string...,' i funkcije SendClientMessage(...,...,string);' dogoditi promjena stringa tj. da se dvije funkcije isprepletu?


Ovdje navodim string kao jednu običnu global varijablu, jer to su zapravo i sve varijable sa čelijama, bilo za tekst ili neÅ¡to drugo. Stoga mene zanima, ovo je samo jedan primjer 'u praksi'... i ja vjerujem da se to može dogoditi (dogodilo se meni pri ispitivanju filterskripte da sam u par trenutaka, dobio čudne rezultate iz  izvrÅ¡ene komande - tekst IC chata ['ee, bok' ili 'dodi do mene' i slično Å¡ta igrači upravo piÅ¡u] ... dobro to jesam malo gledao dali će tako zavrÅ¡iti ali shvatili ste Å¡to sam htio reći).. Zatim sam nakon nekoliko 'spamanja' komandom dobio onaj zadani string (u trenutku kad niti jedan igrač nije niÅ¡ta pisao)


Pa... mene zanima (od onih koji to malo viÅ¡e znaju), jesam li ja u pravu (tj. dali je točno Å¡to sam rekao glede toga da može doći do ispreplitanja izvrÅ¡avanja funkcija) i dali se to može kako spriječiti da ne doÄ'e do toga (i kako ako se može).

Hvala na čitanju.


Poslednja Izmena: Avgust 03, 2011, 18:39:46 POSLE PODNE od [ED] ZicMortal
Respekt: [H]265, John, [03]Garsino, LordShigi, Dujma, Carlsson, Randy, Jacobs, Hu5o, Toni, Lukas, Curtis, Ivo, Hawks, Jack, Koksildo, gonss

Haha OMG => http://zaslike.com/files/9rd5urq94yqagvdsx3i.png [ovo nema nigdje]

Naravno da može. Pogotovo ako imaÅ¡ neku globalnu varijablu. Ako se pogodi baÅ¡ taj trenutak izmÄ'u SCM-a i formata da se negdje promijeni sadžaj varijable, onda će bit u varijabli ovo najnovije, tj. ono Å¡to zadnje promijenilo.

Mislim da sam dobro shvatio o čemu govoriš. :)

Last nick: Paradox

Citat: [GG] Paradox poslato Avgust 03, 2011, 18:39:37 POSLE PODNE
Naravno da može. Pogotovo ako imaÅ¡ neku globalnu varijablu. Ako se pogodi baÅ¡ taj trenutak izmÄ'u SCM-a i formata da se negdje promijeni sadžaj varijable, onda će bit u varijabli ovo najnovije, tj. ono Å¡to zadnje promijenilo.

Mislim da sam dobro shvatio o čemu govoriš. :)

Uzmi u obzir da pawn nije thread friendly te da jedna funkcija koja je zapoceta mora zavrsiti kako bi pocela druga, kolko god brzo to bilo.

Moguce da i jesi u pravu, ovo bi se moglo detaljnije istraziti


EDIT:

1 TEST: 3 Timera, 100ms, svaki u sebi formatira globalnu varijablu "string" i printa konstantno ime funkcije i tu prethodno formatiranu = SVE KAKO SPADA

2 TEST: isto kao i gore samo je tajmer 10ms = SVE KAKO SPADA

3 TEST: (tu sam vec lud) isto kao i 1 TEST samo su tajmeri stavljeni na 5, 10 i 15 ms  = SVE KAKO SPADA

dakle sto se mene tice do ispreplitanja nemoze doci OSIM 1 slucaj kojeg sam se sjetio su thredani mysql queryii  :)
Poslednja Izmena: Avgust 03, 2011, 19:06:37 POSLE PODNE od John

Mislim da moze doci do tog, pr.

format(string, sizeof(string), "[OOC] %s", textigraca[playerid]);
SCMFA(BOJA, string);

Dok u nekoj drugi komandi, timeru ili negdje imas opet

format(string, sizeof(string), "Vas posao je zavrsen, zaradili ste %d$, blablabla..", zarada[playerid]);

Vjerujem da se izmedju formata i SCMFA-a gore, ajmorec 'moze ubacit' drugi format, jer je ipak potrebno neko vrijeme od formata do SCMFA-a.
Poslednja Izmena: Avgust 03, 2011, 21:38:55 POSLE PODNE od [GG] LuKsA
Aequam memento rebus in arduis servare mentem.

Citat: [GG] LuKsA poslato Avgust 03, 2011, 21:38:15 POSLE PODNE
Mislim da moze doci do tog, pr.

format(string, sizeof(string), "[OOC] %s", textigraca[playerid]);
SCMFA(BOJA, string);

Dok u nekoj drugi komandi, timeru ili negdje imas opet

format(string, sizeof(string), "Vas posao je zavrsen, zaradili ste %d$, blablabla..", zarada[playerid]);

Vjerujem da se izmedju formata i SCMFA-a gore, ajmorec 'moze ubacit' drugi format, jer je ipak potrebno neko vrijeme od formata do SCMFA-a.

da ali kao sto sam gore vec rekao, pawn nije thread friendly, znaci da 1 funkcija mora biti potpuno gotova kako bi 2 uopce zapocela, ma kolko god to brzo bilo

Hmm, ok onda, ali je neobjasnjivo kako je onda njemu ono dolazilo..
Aequam memento rebus in arduis servare mentem.

Citat: [GG] LuKsA poslato Avgust 03, 2011, 22:00:39 POSLE PODNE
Hmm, ok onda, ali je neobjasnjivo kako je onda njemu ono dolazilo..

neznam ni ja, eto cak sam i ja isao testirati gore su rezultati

ne moze! PAWN je single-threaded, znaci da se kod izvrsava 'u koracima', tj. po redu.
Poslednja Izmena: Avgust 03, 2011, 22:04:21 POSLE PODNE od Omega-300
aka JOE BULLET :)

Vi ste ovdje usporeÄ'ivali kod u dvima tajmerima (John), mada nisam toliko siguran u to jer funkcija se izvede u manje od 5 ms... ja navodim kao primjer igrač piÅ¡e u IC i neki tekst se izvodi u tajmeru istovremce (da se poklopi da igrač upiÅ¡e tekst nakon 'prvog' formata stringa u tajmeru i da se pojavi u stringu u tajmeru (SCM))

Koliko je to moguće?

@ OnStart - možda malo pretjerujem/(ili pretjerujemo), ali čisto me zanima dali je moguće.
Respekt: [H]265, John, [03]Garsino, LordShigi, Dujma, Carlsson, Randy, Jacobs, Hu5o, Toni, Lukas, Curtis, Ivo, Hawks, Jack, Koksildo, gonss

Haha OMG => http://zaslike.com/files/9rd5urq94yqagvdsx3i.png [ovo nema nigdje]

ne moze se to dogoditi, ne kuzim sta ti tu nije jasno !! NE MOZE SE ISTOVREMENO IZVODITI !
aka JOE BULLET :)