PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Зависание во время исполнения.


Зависание во время исполнения.

Сообщений 1 страница 11 из 11

1

Всем привет.
Постараюсь объяснить ситуцию.
Я решил написать крестики нолики. Но это маловажно.
При запуске моего кода все работает как надо. Но через некоторое время окно программы просто напросто зависает и ни чего кроме аварийного закрытия не сделать.
http://s1.uploads.ru/t/sVqp3.png

Вот сам код. Подскажите может есть какие функции которые раскачают программу от зависания?

Код:
InitSprite()
InitKeyboard()
InitMouse()
OpenWindow(0, 150, 150, 300, 350, "gCrozero")
OpenWindowedScreen(WindowID(0), 0, 50, 300, 300, 0, 0, 0)
UsePNGImageDecoder()

LoadImage(0, "C:\pen.png")

Procedure dBack(); Рисование клеточек и поля.
	Box(0,0,300,300, RGB(230,230,230))
	x.l=10
	lineColor=RGB(120, 180, 250)
	For i=0 To 30 Step 1
    If x=260
    	Line(x,0, 1, 300, RGB(180, 25,25))
    	x+10
    EndIf
    Line(x,0, 1, 300, lineColor)
    x+10
	Next
	y.l=10
	For i=0 To 30 Step 1
    Line(0, y, 300, 1, lineColor)
    y+10
	Next
	
EndProcedure


Repeat
	
	ExamineKeyboard()
	ExamineMouse()
	FlipBuffers()
	;ClearScreen(RGB(0,0,0))

	mxc.l=MouseX()
	myc.l=MouseY()
	
	StartDrawing(ScreenOutput())
    dBack()
    DrawAlphaImage(ImageID(0), mxc, myc-50);Отобразить ручку
	StopDrawing()
	
	Delay(1)
Until KeyboardPushed(#PB_Key_Escape)

Есть предположение что нужно что то выгрузить. Как бы перегружается память программы. А что здесь выгружать? Добавлял ClearScreen() ни чего не изменилось. да они и не причем. Раньше писал программу в которой шарики прыгали под законом физики. Прыгали спокойно ни чего не зависало пока курсор за окно не вывести.
В общем скорее всего виснет из за того что курсор выходить за границы(условно).

Вот ссылка на Ютуб. Там наглядно видно что после нескольких кликов мыши зависает. Иногда зависает когда случайно делаю Drag мыши по полю.
Видео

Отредактировано TantumCapitis (01.09.2012 05:56:20)

0

2

Я что то нарыл про поток. Но мне это мало о чем сказало. Thread?

0

3

Ты создал окно (OpenWindow()) и прекратил работу с ним, т.е. не опрашиваешь информацию о нем в цикле через (Wait)WindowEvent(), по этому Windows считает, что окно "сдохло" (программа на отвечает) и предлагает его закрыть.

Посмотри в справке OpenWindowedScreen() страницу, там есть пример того, как создается окно, в нем Screen и в цикле уже опрашивается и окно и Screen.

Если грубо говоря, то вот так:

Код:
InitSprite()
InitKeyboard()
InitMouse()

UsePNGImageDecoder()

LoadImage(0, "С:\pen.png")

Procedure dBack(); Рисование клеточек и поля.
  Box(0,0,300,300, RGB(230,230,230))
  x.i=10
  lineColor=RGB(120, 180, 250)
  For i=0 To 30 Step 1
    If x=260
      Line(x,0, 1, 300, RGB(180, 25,25))
      x+10
    EndIf
    Line(x,0, 1, 300, lineColor)
    x+10
  Next
  y.i=10
  For i=0 To 30 Step 1
    Line(0, y, 300, 1, lineColor)
    y+10
  Next
EndProcedure

If OpenWindow(0, 150, 150, 300, 350, "gCrozero") And OpenWindowedScreen(WindowID(0), 0, 50, 300, 300, 0, 0, 0) 
  Repeat
    If WaitWindowEvent() = #PB_Event_CloseWindow
      Break
    EndIf
    
    ExamineKeyboard()
    ExamineMouse()
    FlipBuffers()
    ;ClearScreen(RGB(0,0,0))
    
    StartDrawing(ScreenOutput())
    dBack()
    DrawAlphaImage(ImageID(0), MouseX(), MouseY() - 50);Отобразить ручку
    StopDrawing()
    
    ;Delay(1)
  Until KeyboardPushed(#PB_Key_Escape)
EndIf

И не хватает правильно обработки всевозможных ошибок и загрузки ресурсов, ну если ты конечно не просто балуешься.

0

4

Не балуюсь точно. Хотелось бы поподробней о загрузке ресурсов.

Еще стало ругаться на 41 строку. Где DrawAlphaImage(ImageID(0), MouseX(), MouseY() - 50);Отобразить ручку
До изменений вами все работало =)

Отредактировано TantumCapitis (01.09.2012 18:12:48)

0

5

Чуть чуть изменил. Теперь все работает.

Код:
InitSprite()
InitKeyboard()
InitMouse()
OpenWindow(0, 150, 150, 300, 350, "gCrozero")
OpenWindowedScreen(WindowID(0), 0, 50, 300, 300, 0, 0, 0)
UsePNGImageDecoder()

LoadImage(0, "C:\pen.png")

Procedure dBack(); Рисование клеточек и поля.
	Box(0,0,300,300, RGB(230,230,230))
	x.l=10
	lineColor=RGB(120, 180, 250)
	For i=0 To 30 Step 1
    If x=260
    	Line(x,0, 1, 300, RGB(180, 25,25))
    	x+10
    EndIf
    Line(x,0, 1, 300, lineColor)
    x+10
	Next
	y.l=10
	For i=0 To 30 Step 1
    Line(0, y, 300, 1, lineColor)
    y+10
	Next
	
EndProcedure


Repeat
	If WaitWindowEvent() = #PB_Event_CloseWindow
    Break
	EndIf
	ExamineKeyboard()
	ExamineMouse()
	FlipBuffers()
	;ClearScreen(RGB(0,0,0))

	mxc.l=MouseX()
	myc.l=MouseY()
	
	StartDrawing(ScreenOutput())
    dBack()
    DrawAlphaImage(ImageID(0), mxc, myc-50);Отобразить ручку
	StopDrawing()
	
	Delay(1)
Until KeyboardPushed(#PB_Key_Escape)

Осталось послушать о правильной загрузке ресурсов от вас.

0

6

Уж если пишется игрушка, то видимо уместнее работать со спрайтами
Загрузить сразу в ресурсы

Код:
CatchSprite(0, ?Pic)
  End

  Pic: IncludeBinary ""C:\pen.png""

и на экран выводить спрайтом - DisplaySprite. У спрайта больше всяких возможностей.

0

7

О. Толковый совет. Спасибо Вини. А есть какой нибудь туториал на русском о спрайтах?

0

8

TantumCapitis написал(а):

какой нибудь туториал на русском о спрайтах

http://purebasic.ru/manual.php?id=1207&lng=rus

0

9

TantumCapitis написал(а):

Хотелось бы поподробней о загрузке ресурсов.

Надо делать обработку всех функций, которые могут вернуть ошибку.
Открываешь окно — проверяешь открылось ли оно, если нет — пишешь ошибку пользователю и закрываешь программу.
Загружаешь ресурс (спрайт, изображение, что угодно из файла или другого места) — проверяешь успешность загрузки.
И т.д.

0

10

А. Методом условий. Понял. Спасибо

0

11

Paranoia написал(а):

Загружаешь ресурс (спрайт, изображение, что угодно из файла или другого места) — проверяешь успешность загрузки.

В случае с IncludeBinary это не требуется - ошибка, если есть такая, вылезет на стадии компиляции.

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Зависание во время исполнения.