Skocz do zawartości

GMThreads crashuje grę


bartas

Rekomendowane odpowiedzi

Siema, po pierwsze nie wiem czy dobry dział bo problem może być prosty :P

dwa: mam taki kod w stepie

GML
loadthr=thread_create("

section_init()

section=x div 1000 + y div 1000 * 3;

section_load(section,'mapa.ini')"

,1)

 

 

if ( loadthr ) {

thread_set_priority( loadthr, 3 );

thread_resume( loadthr );

} else

show_message("Nie mozna stworzyc wątka")

funkcje section_init() i section_load() działają poprawnie bo wszystko się ładuje, ale zaraz po uruchomieniu gry (obiekty już się wczytały) gra wywala kilka błędów których nigdy wcześniej nie było, a następnie windowsowy błąd "Aplikacja strange.exe przestała działać" ;/ używam gm8, gmthreads 2.0, vista basic

Pomocy.

EDIT: dodam że bez użycia wątków wszystko działa.

EDIT2: Obecnie kod wygląda tak:

GML
loadthr=thread_create("while(true){

 

section=x div 1000 + y div 1000 * 3;

section_load(global.section,'mapa.ini')

 

}

"

,1)

 

 

if ( loadthr ) {

//thread_set_processor(loadthr,0)

thread_set_priority( loadthr, 3 );

thread_resume( loadthr );

} else

show_message( "Nie mozna stworzyc watku" );

Żadne błędy nie wyskakują, ale kod

GML
while(true){

 

section=x div 1000 + y div 1000 * 3;

section_load(global.section,'mapa.ini')

 

}

się nie wykonuje (powinien tworzyć obiekty) :/

Odnośnik do komentarza
Udostępnij na innych stronach

Crash zdarza się, gdy jeden z wątków odwołuje się do pamięci, która w tym samym momencie jest modyfikowana przez inny wątek (np. poprzez operowanie na zmiennych, strukturach danych etc.). Możliwe też, że użyłeś w tych skryptach section_* jakichś funkcji GML nie przystosowanych do MT.

No i z tego co widziałem na gmc.yoyogames.com w temacie GMThreads, zdaje się, że samo używanie skryptów w wątkach nie trybi tak jak trzeba (niepoprawne argumenty są przekazywane) :/

Odnośnik do komentarza
Udostępnij na innych stronach

a wiec czy zadziala wtedy pobranie tresci skryptu, podmiana przez string_replace_all() argument0 itp na konkretne wartosci argumentow i tworzenie watku na wynikowym stringu kodu?

 

GML (SectionLoadThread)
global.text=script_get_text(section_load)

for(i=0;i<12;i+=1)

global.text=string_replace_all(global.text,'argument'+string(i),string(argument))

thread_execute(3,global.text) // nie pamietam nazwy funkcji od wykonania watku;P</span>

Odnośnik do komentarza
Udostępnij na innych stronach

Crash zdarza się, gdy jeden z wątków odwołuje się do pamięci, która w tym samym momencie jest modyfikowana przez inny wątek (np. poprzez operowanie na zmiennych, strukturach danych etc.). Możliwe też, że użyłeś w tych skryptach section_* jakichś funkcji GML nie przystosowanych do MT.

No i z tego co widziałem na gmc.yoyogames.com w temacie GMThreads, zdaje się, że samo używanie skryptów w wątkach nie trybi tak jak trzeba (niepoprawne argumenty są przekazywane) :/

 

W skrypcie używam funkcji: ini_open(), ini_close(), ini_read_real/string(), instance_create() i operacje na zmiennych globalnych i zmiennych innych obiektów (np. engine.object_index)

Teraz nie używam skryptu tylko skopiowałem jego kod i wkleiłem w thread_create() i nadal to samo. Wątek tworze tylko ten jeden, poza tym nigdzie indziej nie używam tych zmiennych :( może to dlatego że tworzę obiekty? No ale teraz nic się nie tworzy czyli kod nie jest wykonywany.

Odnośnik do komentarza
Udostępnij na innych stronach

1. Sry za doubleposta, ale nikt by nie zauważył jakbym zedytował, a problem musi być rozwiązany bo bez niego nie mogę kontynuować

2. Teraz jak tylko uruchamiam grę to FPS wynosi jeden, wątek próbuje się zamknąć ale mu nie wychodzi więc trzeba wymusić zamknięcie, potem gra się zamyka, wyskakuje komunikat "strange.exe nie odpowiada", a potem: "Exception EOSError in module strange.exe at 00010B31. System error. Code: 1400 Nieprawidłowe dojście okna", następnie: "Acces violation at adress 721A4A25. Read of address 721A4A25" 3 razy, a potem znowu "strange.exe nie odpowiada" :( Proszę pomocy.

Teraz zauważyłem że błędy zależą od kaprysu kompa. Teraz po prostu gra się wyłączyła z komunikatem "strange.exe nie odpowiada" . Po ponownym włączeniu to co na początku. I jeszcze czasaami wyskoczy błąd że nie może znaleźć zmiennej w obiekcie "obj_krzak". Najgorsze jest to że ta zmienna w tym obiekcie jest zadeklarowana i dopóki nie użyłem wątków wszystko działało :(

EDIT: zapomniałem dodać że funkcje działają, bo jak gra działała 2 sekundy to widziałem jak się obiekty wczytują :) chyba jedyna dobra wiadomość

EDIT2: a może dlatego że zmienne których używam w wątku deklaruje w create, a nie w tym wątku?

EDIT3 :P : wydaje mi się że obiekty są za wolno tworzone (jak nie używałem wątków wszystko się ładowało szybko) i to powoduje wyskakiwanie błędów GMowych co powoduje crasha... tylko jak to rozwiązać?

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...