Pretraga

Pritisnite Enter za pretragu ili Escape za zatvaranje

[Pomoc] Ispreplitanje funkcija?

pre 14 godina
1,016
pregleda
10
postova
[GG] ZicMortal
Made Man
pre 14 godina
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.
Johnâ„¢
Godfather
pre 14 godina
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Å¡. 🙂
John
Enforcer
pre 14 godina
Quote from August 3, 2011, 4:39 pm:
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  🙂
GGC
Godfather
pre 14 godina
Mislim da moze doci do tog, pr.

format(string, sizeof(string), " %s", textigraca);
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);

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.
John
Enforcer
pre 14 godina
Quote from August 3, 2011, 7:38 pm:
Mislim da moze doci do tog, pr.

format(string, sizeof(string), " %s", textigraca);
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);

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
GGC
Godfather
pre 14 godina
Hmm, ok onda, ali je neobjasnjivo kako je onda njemu ono dolazilo..
John
Enforcer
pre 14 godina
Quote from August 3, 2011, 8:00 pm:
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
Omega-300
Rookie
pre 14 godina
ne moze! PAWN je single-threaded, znaci da se kod izvrsava 'u koracima', tj. po redu.
[GG] ZicMortal
Made Man
pre 14 godina
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.
Omega-300
Rookie
pre 14 godina
ne moze se to dogoditi, ne kuzim sta ti tu nije jasno !! NE MOZE SE ISTOVREMENO IZVODITI !

Morate biti prijavljeni da biste odgovorili na ovu temu.

Prijava