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.
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Å¡. :)
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 :)
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.
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..
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.
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.
ne moze se to dogoditi, ne kuzim sta ti tu nije jasno !! NE MOZE SE ISTOVREMENO IZVODITI !